* [Qemu-devel] [PULL 0/4] hmp queue
@ 2017-04-24 15:32 Dr. David Alan Gilbert (git)
2017-04-24 15:32 ` [Qemu-devel] [PULL 1/4] hmp: gpa2hva and gpa2hpa hostaddr command Dr. David Alan Gilbert (git)
` (4 more replies)
0 siblings, 5 replies; 12+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-04-24 15:32 UTC (permalink / raw)
To: qemu-devel; +Cc: pbonzini, thuth
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
The following changes since commit 4c55b1d0bad8a703f0499fe62e3761a0cd288da3:
Merge remote-tracking branch 'remotes/armbru/tags/pull-error-2017-04-24' into staging (2017-04-24 14:49:48 +0100)
are available in the git repository at:
git://github.com/dagrh/qemu.git tags/pull-hmp-20170424
for you to fetch changes up to e4e3992e626c4cc7514b271807c90f587771c646:
tests: Add a tester for HMP commands (2017-04-24 15:55:35 +0100)
----------------------------------------------------------------
HMP pull
----------------------------------------------------------------
Paolo Bonzini (1):
hmp: gpa2hva and gpa2hpa hostaddr command
Thomas Huth (3):
libqtest: Ignore QMP events when parsing the response for HMP commands
libqtest: Add a generic function to run a callback function for every machine
tests: Add a tester for HMP commands
hmp-commands.hx | 32 ++++++++++
monitor.c | 101 +++++++++++++++++++++++++++++++
tests/Makefile.include | 2 +
tests/libqtest.c | 36 +++++++++++
tests/libqtest.h | 12 +++-
tests/pc-cpu-test.c | 95 +++++++++++------------------
tests/qom-test.c | 36 ++---------
tests/test-hmp.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++++
8 files changed, 385 insertions(+), 90 deletions(-)
create mode 100644 tests/test-hmp.c
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 1/4] hmp: gpa2hva and gpa2hpa hostaddr command
2017-04-24 15:32 [Qemu-devel] [PULL 0/4] hmp queue Dr. David Alan Gilbert (git)
@ 2017-04-24 15:32 ` Dr. David Alan Gilbert (git)
2017-04-24 15:32 ` [Qemu-devel] [PULL 2/4] libqtest: Ignore QMP events when parsing the response for HMP commands Dr. David Alan Gilbert (git)
` (3 subsequent siblings)
4 siblings, 0 replies; 12+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-04-24 15:32 UTC (permalink / raw)
To: qemu-devel; +Cc: pbonzini, thuth
From: Paolo Bonzini <pbonzini@redhat.com>
These commands are useful when testing machine-check passthrough.
gpa2hva is useful to inject a MADV_HWPOISON madvise from gdb, while
gpa2hpa is useful to inject an error with the mce-inject kernel
module.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <1490021158-4469-1-git-send-email-pbonzini@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20170420133058.12911-1-pbonzini@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
hmp-commands.hx | 32 ++++++++++++++++++
monitor.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 133 insertions(+)
diff --git a/hmp-commands.hx b/hmp-commands.hx
index 88192817b2..0aca984261 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -526,6 +526,38 @@ Dump 80 16 bit values at the start of the video memory.
ETEXI
{
+ .name = "gpa2hva",
+ .args_type = "addr:l",
+ .params = "addr",
+ .help = "print the host virtual address corresponding to a guest physical address",
+ .cmd = hmp_gpa2hva,
+ },
+
+STEXI
+@item gpa2hva @var{addr}
+@findex gpa2hva
+Print the host virtual address at which the guest's physical address @var{addr}
+is mapped.
+ETEXI
+
+#ifdef CONFIG_LINUX
+ {
+ .name = "gpa2hpa",
+ .args_type = "addr:l",
+ .params = "addr",
+ .help = "print the host physical address corresponding to a guest physical address",
+ .cmd = hmp_gpa2hpa,
+ },
+#endif
+
+STEXI
+@item gpa2hpa @var{addr}
+@findex gpa2hpa
+Print the host physical address at which the guest's physical address @var{addr}
+is mapped.
+ETEXI
+
+ {
.name = "p|print",
.args_type = "fmt:/,val:l",
.params = "/fmt expr",
diff --git a/monitor.c b/monitor.c
index be282ecb80..a27dc8003f 100644
--- a/monitor.c
+++ b/monitor.c
@@ -1421,6 +1421,107 @@ static void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
memory_dump(mon, count, format, size, addr, 1);
}
+static void *gpa2hva(MemoryRegion **p_mr, hwaddr addr, Error **errp)
+{
+ MemoryRegionSection mrs = memory_region_find(get_system_memory(),
+ addr, 1);
+
+ if (!mrs.mr) {
+ error_setg(errp, "No memory is mapped at address 0x%" HWADDR_PRIx, addr);
+ return NULL;
+ }
+
+ if (!memory_region_is_ram(mrs.mr) && !memory_region_is_romd(mrs.mr)) {
+ error_setg(errp, "Memory at address 0x%" HWADDR_PRIx "is not RAM", addr);
+ memory_region_unref(mrs.mr);
+ return NULL;
+ }
+
+ *p_mr = mrs.mr;
+ return qemu_map_ram_ptr(mrs.mr->ram_block, mrs.offset_within_region);
+}
+
+static void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
+{
+ hwaddr addr = qdict_get_int(qdict, "addr");
+ Error *local_err = NULL;
+ MemoryRegion *mr = NULL;
+ void *ptr;
+
+ ptr = gpa2hva(&mr, addr, &local_err);
+ if (local_err) {
+ error_report_err(local_err);
+ return;
+ }
+
+ monitor_printf(mon, "Host virtual address for 0x%" HWADDR_PRIx
+ " (%s) is %p\n",
+ addr, mr->name, ptr);
+
+ memory_region_unref(mr);
+}
+
+#ifdef CONFIG_LINUX
+static uint64_t vtop(void *ptr, Error **errp)
+{
+ uint64_t pinfo;
+ uint64_t ret = -1;
+ uintptr_t addr = (uintptr_t) ptr;
+ uintptr_t pagesize = getpagesize();
+ off_t offset = addr / pagesize * sizeof(pinfo);
+ int fd;
+
+ fd = open("/proc/self/pagemap", O_RDONLY);
+ if (fd == -1) {
+ error_setg_errno(errp, errno, "Cannot open /proc/self/pagemap");
+ return -1;
+ }
+
+ /* Force copy-on-write if necessary. */
+ atomic_add((uint8_t *)ptr, 0);
+
+ if (pread(fd, &pinfo, sizeof(pinfo), offset) != sizeof(pinfo)) {
+ error_setg_errno(errp, errno, "Cannot read pagemap");
+ goto out;
+ }
+ if ((pinfo & (1ull << 63)) == 0) {
+ error_setg(errp, "Page not present");
+ goto out;
+ }
+ ret = ((pinfo & 0x007fffffffffffffull) * pagesize) | (addr & (pagesize - 1));
+
+out:
+ close(fd);
+ return ret;
+}
+
+static void hmp_gpa2hpa(Monitor *mon, const QDict *qdict)
+{
+ hwaddr addr = qdict_get_int(qdict, "addr");
+ Error *local_err = NULL;
+ MemoryRegion *mr = NULL;
+ void *ptr;
+ uint64_t physaddr;
+
+ ptr = gpa2hva(&mr, addr, &local_err);
+ if (local_err) {
+ error_report_err(local_err);
+ return;
+ }
+
+ physaddr = vtop(ptr, &local_err);
+ if (local_err) {
+ error_report_err(local_err);
+ } else {
+ monitor_printf(mon, "Host physical address for 0x%" HWADDR_PRIx
+ " (%s) is 0x%" PRIx64 "\n",
+ addr, mr->name, (uint64_t) physaddr);
+ }
+
+ memory_region_unref(mr);
+}
+#endif
+
static void do_print(Monitor *mon, const QDict *qdict)
{
int format = qdict_get_int(qdict, "format");
--
2.12.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 2/4] libqtest: Ignore QMP events when parsing the response for HMP commands
2017-04-24 15:32 [Qemu-devel] [PULL 0/4] hmp queue Dr. David Alan Gilbert (git)
2017-04-24 15:32 ` [Qemu-devel] [PULL 1/4] hmp: gpa2hva and gpa2hpa hostaddr command Dr. David Alan Gilbert (git)
@ 2017-04-24 15:32 ` Dr. David Alan Gilbert (git)
2017-04-24 15:32 ` [Qemu-devel] [PULL 3/4] libqtest: Add a generic function to run a callback function for every machine Dr. David Alan Gilbert (git)
` (2 subsequent siblings)
4 siblings, 0 replies; 12+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-04-24 15:32 UTC (permalink / raw)
To: qemu-devel; +Cc: pbonzini, thuth
From: Thomas Huth <thuth@redhat.com>
When running certain HMP commands (like "device_del") via QMP, we
can sometimes get a QMP event in the response first, so that the
"g_assert(ret)" statement in qtest_hmp() triggers and the test
fails. Fix this by ignoring such QMP events while looking for the
real return value from QMP.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1490860207-8302-2-git-send-email-thuth@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Added note to qtest_hmp/qtest_hmpv's header description to say
it discards events
---
tests/libqtest.c | 6 ++++++
tests/libqtest.h | 4 +++-
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/tests/libqtest.c b/tests/libqtest.c
index 99b1195355..0b0bf1d460 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -588,6 +588,12 @@ char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
" 'arguments': {'command-line': %s}}",
cmd);
ret = g_strdup(qdict_get_try_str(resp, "return"));
+ while (ret == NULL && qdict_get_try_str(resp, "event")) {
+ /* Ignore asynchronous QMP events */
+ QDECREF(resp);
+ resp = qtest_qmp_receive(s);
+ ret = g_strdup(qdict_get_try_str(resp, "return"));
+ }
g_assert(ret);
QDECREF(resp);
g_free(cmd);
diff --git a/tests/libqtest.h b/tests/libqtest.h
index 2c9962d94f..ee237448da 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -132,11 +132,12 @@ void qtest_qmp_eventwait(QTestState *s, const char *event);
QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event);
/**
- * qtest_hmpv:
+ * qtest_hmp:
* @s: #QTestState instance to operate on.
* @fmt...: HMP command to send to QEMU
*
* Send HMP command to QEMU via QMP's human-monitor-command.
+ * QMP events are discarded.
*
* Returns: the command's output. The caller should g_free() it.
*/
@@ -149,6 +150,7 @@ char *qtest_hmp(QTestState *s, const char *fmt, ...);
* @ap: HMP command arguments
*
* Send HMP command to QEMU via QMP's human-monitor-command.
+ * QMP events are discarded.
*
* Returns: the command's output. The caller should g_free() it.
*/
--
2.12.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 3/4] libqtest: Add a generic function to run a callback function for every machine
2017-04-24 15:32 [Qemu-devel] [PULL 0/4] hmp queue Dr. David Alan Gilbert (git)
2017-04-24 15:32 ` [Qemu-devel] [PULL 1/4] hmp: gpa2hva and gpa2hpa hostaddr command Dr. David Alan Gilbert (git)
2017-04-24 15:32 ` [Qemu-devel] [PULL 2/4] libqtest: Ignore QMP events when parsing the response for HMP commands Dr. David Alan Gilbert (git)
@ 2017-04-24 15:32 ` Dr. David Alan Gilbert (git)
2017-04-24 15:32 ` [Qemu-devel] [PULL 4/4] tests: Add a tester for HMP commands Dr. David Alan Gilbert (git)
2017-04-24 16:50 ` [Qemu-devel] [PULL 0/4] hmp queue Peter Maydell
4 siblings, 0 replies; 12+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-04-24 15:32 UTC (permalink / raw)
To: qemu-devel; +Cc: pbonzini, thuth
From: Thomas Huth <thuth@redhat.com>
Some tests need to run single tests for every available machine of the
current QEMU binary. To avoid code duplication, let's extract this
code that deals with 'query-machines' into a separate function.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1490860207-8302-3-git-send-email-thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
tests/libqtest.c | 30 +++++++++++++++++
tests/libqtest.h | 8 +++++
tests/pc-cpu-test.c | 95 ++++++++++++++++++++---------------------------------
tests/qom-test.c | 36 ++++----------------
4 files changed, 80 insertions(+), 89 deletions(-)
diff --git a/tests/libqtest.c b/tests/libqtest.c
index 0b0bf1d460..512c150266 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -946,3 +946,33 @@ bool qtest_big_endian(QTestState *s)
{
return s->big_endian;
}
+
+void qtest_cb_for_every_machine(void (*cb)(const char *machine))
+{
+ QDict *response, *minfo;
+ QList *list;
+ const QListEntry *p;
+ QObject *qobj;
+ QString *qstr;
+ const char *mname;
+
+ qtest_start("-machine none");
+ response = qmp("{ 'execute': 'query-machines' }");
+ g_assert(response);
+ list = qdict_get_qlist(response, "return");
+ g_assert(list);
+
+ for (p = qlist_first(list); p; p = qlist_next(p)) {
+ minfo = qobject_to_qdict(qlist_entry_obj(p));
+ g_assert(minfo);
+ qobj = qdict_get(minfo, "name");
+ g_assert(qobj);
+ qstr = qobject_to_qstring(qobj);
+ g_assert(qstr);
+ mname = qstring_get_str(qstr);
+ cb(mname);
+ }
+
+ qtest_end();
+ QDECREF(response);
+}
diff --git a/tests/libqtest.h b/tests/libqtest.h
index ee237448da..38bc1e9953 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -919,4 +919,12 @@ void qmp_fd_send(int fd, const char *fmt, ...);
QDict *qmp_fdv(int fd, const char *fmt, va_list ap);
QDict *qmp_fd(int fd, const char *fmt, ...);
+/**
+ * qtest_cb_for_every_machine:
+ * @cb: Pointer to the callback function
+ *
+ * Call a callback function for every name of all available machines.
+ */
+void qtest_cb_for_every_machine(void (*cb)(const char *machine));
+
#endif
diff --git a/tests/pc-cpu-test.c b/tests/pc-cpu-test.c
index c3a2633d3c..c4211a4e85 100644
--- a/tests/pc-cpu-test.c
+++ b/tests/pc-cpu-test.c
@@ -79,69 +79,46 @@ static void test_data_free(gpointer data)
g_free(pc);
}
-static void add_pc_test_cases(void)
+static void add_pc_test_case(const char *mname)
{
- QDict *response, *minfo;
- QList *list;
- const QListEntry *p;
- QObject *qobj;
- QString *qstr;
- const char *mname;
char *path;
PCTestData *data;
- qtest_start("-machine none");
- response = qmp("{ 'execute': 'query-machines' }");
- g_assert(response);
- list = qdict_get_qlist(response, "return");
- g_assert(list);
-
- for (p = qlist_first(list); p; p = qlist_next(p)) {
- minfo = qobject_to_qdict(qlist_entry_obj(p));
- g_assert(minfo);
- qobj = qdict_get(minfo, "name");
- g_assert(qobj);
- qstr = qobject_to_qstring(qobj);
- g_assert(qstr);
- mname = qstring_get_str(qstr);
- if (!g_str_has_prefix(mname, "pc-")) {
- continue;
- }
- data = g_malloc(sizeof(PCTestData));
- data->machine = g_strdup(mname);
- data->cpu_model = "Haswell"; /* 1.3+ theoretically */
- data->sockets = 1;
- data->cores = 3;
- data->threads = 2;
- data->maxcpus = data->sockets * data->cores * data->threads * 2;
- if (g_str_has_suffix(mname, "-1.4") ||
- (strcmp(mname, "pc-1.3") == 0) ||
- (strcmp(mname, "pc-1.2") == 0) ||
- (strcmp(mname, "pc-1.1") == 0) ||
- (strcmp(mname, "pc-1.0") == 0) ||
- (strcmp(mname, "pc-0.15") == 0) ||
- (strcmp(mname, "pc-0.14") == 0) ||
- (strcmp(mname, "pc-0.13") == 0) ||
- (strcmp(mname, "pc-0.12") == 0) ||
- (strcmp(mname, "pc-0.11") == 0) ||
- (strcmp(mname, "pc-0.10") == 0)) {
- path = g_strdup_printf("cpu/%s/init/%ux%ux%u&maxcpus=%u",
- mname, data->sockets, data->cores,
- data->threads, data->maxcpus);
- qtest_add_data_func_full(path, data, test_pc_without_cpu_add,
- test_data_free);
- g_free(path);
- } else {
- path = g_strdup_printf("cpu/%s/add/%ux%ux%u&maxcpus=%u",
- mname, data->sockets, data->cores,
- data->threads, data->maxcpus);
- qtest_add_data_func_full(path, data, test_pc_with_cpu_add,
- test_data_free);
- g_free(path);
- }
+ if (!g_str_has_prefix(mname, "pc-")) {
+ return;
+ }
+ data = g_malloc(sizeof(PCTestData));
+ data->machine = g_strdup(mname);
+ data->cpu_model = "Haswell"; /* 1.3+ theoretically */
+ data->sockets = 1;
+ data->cores = 3;
+ data->threads = 2;
+ data->maxcpus = data->sockets * data->cores * data->threads * 2;
+ if (g_str_has_suffix(mname, "-1.4") ||
+ (strcmp(mname, "pc-1.3") == 0) ||
+ (strcmp(mname, "pc-1.2") == 0) ||
+ (strcmp(mname, "pc-1.1") == 0) ||
+ (strcmp(mname, "pc-1.0") == 0) ||
+ (strcmp(mname, "pc-0.15") == 0) ||
+ (strcmp(mname, "pc-0.14") == 0) ||
+ (strcmp(mname, "pc-0.13") == 0) ||
+ (strcmp(mname, "pc-0.12") == 0) ||
+ (strcmp(mname, "pc-0.11") == 0) ||
+ (strcmp(mname, "pc-0.10") == 0)) {
+ path = g_strdup_printf("cpu/%s/init/%ux%ux%u&maxcpus=%u",
+ mname, data->sockets, data->cores,
+ data->threads, data->maxcpus);
+ qtest_add_data_func_full(path, data, test_pc_without_cpu_add,
+ test_data_free);
+ g_free(path);
+ } else {
+ path = g_strdup_printf("cpu/%s/add/%ux%ux%u&maxcpus=%u",
+ mname, data->sockets, data->cores,
+ data->threads, data->maxcpus);
+ qtest_add_data_func_full(path, data, test_pc_with_cpu_add,
+ test_data_free);
+ g_free(path);
}
- QDECREF(response);
- qtest_end();
}
int main(int argc, char **argv)
@@ -151,7 +128,7 @@ int main(int argc, char **argv)
g_test_init(&argc, &argv, NULL);
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
- add_pc_test_cases();
+ qtest_cb_for_every_machine(add_pc_test_case);
}
return g_test_run();
diff --git a/tests/qom-test.c b/tests/qom-test.c
index d48f890e84..ab0595dc75 100644
--- a/tests/qom-test.c
+++ b/tests/qom-test.c
@@ -107,46 +107,22 @@ static void test_machine(gconstpointer data)
g_free((void *)machine);
}
-static void add_machine_test_cases(void)
+static void add_machine_test_case(const char *mname)
{
const char *arch = qtest_get_arch();
- QDict *response, *minfo;
- QList *list;
- const QListEntry *p;
- QObject *qobj;
- QString *qstr;
- const char *mname;
- qtest_start("-machine none");
- response = qmp("{ 'execute': 'query-machines' }");
- g_assert(response);
- list = qdict_get_qlist(response, "return");
- g_assert(list);
-
- for (p = qlist_first(list); p; p = qlist_next(p)) {
- minfo = qobject_to_qdict(qlist_entry_obj(p));
- g_assert(minfo);
- qobj = qdict_get(minfo, "name");
- g_assert(qobj);
- qstr = qobject_to_qstring(qobj);
- g_assert(qstr);
- mname = qstring_get_str(qstr);
- if (!is_blacklisted(arch, mname)) {
- char *path = g_strdup_printf("qom/%s", mname);
- qtest_add_data_func(path, g_strdup(mname), test_machine);
- g_free(path);
- }
+ if (!is_blacklisted(arch, mname)) {
+ char *path = g_strdup_printf("qom/%s", mname);
+ qtest_add_data_func(path, g_strdup(mname), test_machine);
+ g_free(path);
}
-
- qtest_end();
- QDECREF(response);
}
int main(int argc, char **argv)
{
g_test_init(&argc, &argv, NULL);
- add_machine_test_cases();
+ qtest_cb_for_every_machine(add_machine_test_case);
return g_test_run();
}
--
2.12.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PULL 4/4] tests: Add a tester for HMP commands
2017-04-24 15:32 [Qemu-devel] [PULL 0/4] hmp queue Dr. David Alan Gilbert (git)
` (2 preceding siblings ...)
2017-04-24 15:32 ` [Qemu-devel] [PULL 3/4] libqtest: Add a generic function to run a callback function for every machine Dr. David Alan Gilbert (git)
@ 2017-04-24 15:32 ` Dr. David Alan Gilbert (git)
2017-04-24 16:50 ` [Qemu-devel] [PULL 0/4] hmp queue Peter Maydell
4 siblings, 0 replies; 12+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-04-24 15:32 UTC (permalink / raw)
To: qemu-devel; +Cc: pbonzini, thuth
From: Thomas Huth <thuth@redhat.com>
HMP commands do not get any automatic testing yet, so on certain
QEMU machines, some HMP commands were causing crashes in the past.
Thus we should test HMP commands in our test suite, too, to avoid
that such problems creep in again in the future.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1490860207-8302-4-git-send-email-thuth@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
tests/Makefile.include | 2 +
tests/test-hmp.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 163 insertions(+)
create mode 100644 tests/test-hmp.c
diff --git a/tests/Makefile.include b/tests/Makefile.include
index 579ec07cce..31931c0d77 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -331,6 +331,7 @@ check-qtest-xtensaeb-y = $(check-qtest-xtensa-y)
check-qtest-s390x-y = tests/boot-serial-test$(EXESUF)
check-qtest-generic-y += tests/qom-test$(EXESUF)
+check-qtest-generic-y += tests/test-hmp$(EXESUF)
qapi-schema += alternate-any.json
qapi-schema += alternate-array.json
@@ -720,6 +721,7 @@ tests/tpci200-test$(EXESUF): tests/tpci200-test.o
tests/display-vga-test$(EXESUF): tests/display-vga-test.o
tests/ipoctal232-test$(EXESUF): tests/ipoctal232-test.o
tests/qom-test$(EXESUF): tests/qom-test.o
+tests/test-hmp$(EXESUF): tests/test-hmp.o
tests/drive_del-test$(EXESUF): tests/drive_del-test.o $(libqos-pc-obj-y)
tests/qdev-monitor-test$(EXESUF): tests/qdev-monitor-test.o $(libqos-pc-obj-y)
tests/nvme-test$(EXESUF): tests/nvme-test.o
diff --git a/tests/test-hmp.c b/tests/test-hmp.c
new file mode 100644
index 0000000000..339ed41d54
--- /dev/null
+++ b/tests/test-hmp.c
@@ -0,0 +1,161 @@
+/*
+ * Test HMP commands.
+ *
+ * Copyright (c) 2017 Red Hat Inc.
+ *
+ * Author:
+ * Thomas Huth <thuth@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2
+ * or later. See the COPYING file in the top-level directory.
+ *
+ * This test calls some HMP commands for all machines that the current
+ * QEMU binary provides, to check whether they terminate successfully
+ * (i.e. do not crash QEMU).
+ */
+
+#include "qemu/osdep.h"
+#include "libqtest.h"
+
+static int verbose;
+
+static const char *hmp_cmds[] = {
+ "boot_set ndc",
+ "chardev-add null,id=testchardev1",
+ "chardev-remove testchardev1",
+ "commit all",
+ "cpu-add 1",
+ "cpu 0",
+ "device_add ?",
+ "device_add usb-mouse,id=mouse1",
+ "mouse_button 7",
+ "mouse_move 10 10",
+ "mouse_button 0",
+ "device_del mouse1",
+ "dump-guest-memory /dev/null 0 4096",
+ "gdbserver",
+ "host_net_add user id=net0",
+ "hostfwd_add tcp::43210-:43210",
+ "hostfwd_remove tcp::43210-:43210",
+ "host_net_remove 0 net0",
+ "i /w 0",
+ "log all",
+ "log none",
+ "memsave 0 4096 \"/dev/null\"",
+ "migrate_set_cache_size 1",
+ "migrate_set_downtime 1",
+ "migrate_set_speed 1",
+ "netdev_add user,id=net1",
+ "set_link net1 off",
+ "set_link net1 on",
+ "netdev_del net1",
+ "nmi",
+ "o /w 0 0x1234",
+ "object_add memory-backend-ram,id=mem1,size=256M",
+ "object_del mem1",
+ "pmemsave 0 4096 \"/dev/null\"",
+ "p $pc + 8",
+ "qom-list /",
+ "qom-set /machine initrd test",
+ "screendump /dev/null",
+ "sendkey x",
+ "singlestep on",
+ "wavcapture /dev/null",
+ "stopcapture 0",
+ "sum 0 512",
+ "x /8i 0x100",
+ "xp /16x 0",
+ NULL
+};
+
+/* Run through the list of pre-defined commands */
+static void test_commands(void)
+{
+ char *response;
+ int i;
+
+ for (i = 0; hmp_cmds[i] != NULL; i++) {
+ if (verbose) {
+ fprintf(stderr, "\t%s\n", hmp_cmds[i]);
+ }
+ response = hmp(hmp_cmds[i]);
+ g_free(response);
+ }
+
+}
+
+/* Run through all info commands and call them blindly (without arguments) */
+static void test_info_commands(void)
+{
+ char *resp, *info, *info_buf, *endp;
+
+ info_buf = info = hmp("help info");
+
+ while (*info) {
+ /* Extract the info command, ignore parameters and description */
+ g_assert(strncmp(info, "info ", 5) == 0);
+ endp = strchr(&info[5], ' ');
+ g_assert(endp != NULL);
+ *endp = '\0';
+ /* Now run the info command */
+ if (verbose) {
+ fprintf(stderr, "\t%s\n", info);
+ }
+ resp = hmp(info);
+ g_free(resp);
+ /* And move forward to the next line */
+ info = strchr(endp + 1, '\n');
+ if (!info) {
+ break;
+ }
+ info += 1;
+ }
+
+ g_free(info_buf);
+}
+
+static void test_machine(gconstpointer data)
+{
+ const char *machine = data;
+ char *args;
+
+ args = g_strdup_printf("-S -M %s", machine);
+ qtest_start(args);
+
+ test_info_commands();
+ test_commands();
+
+ qtest_end();
+ g_free(args);
+ g_free((void *)data);
+}
+
+static void add_machine_test_case(const char *mname)
+{
+ char *path = g_strdup_printf("hmp/%s", mname);
+
+ /* Ignore blacklisted machines that have known problems */
+ if (!strcmp("isapc", mname) == 0 || !strcmp("puv3", mname)
+ || !strcmp("tricore_testboard", mname)
+ || !strcmp("xenfv", mname) == 0 || !strcmp("xenpv", mname)) {
+ return;
+ }
+
+ qtest_add_data_func(path, g_strdup(mname), test_machine);
+ g_free(path);
+}
+
+int main(int argc, char **argv)
+{
+ char *v_env = getenv("V");
+
+ if (v_env && *v_env >= '2') {
+ verbose = true;
+ }
+
+ g_test_init(&argc, &argv, NULL);
+
+ qtest_cb_for_every_machine(add_machine_test_case);
+
+ return g_test_run();
+}
--
2.12.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PULL 0/4] hmp queue
2017-04-24 15:32 [Qemu-devel] [PULL 0/4] hmp queue Dr. David Alan Gilbert (git)
` (3 preceding siblings ...)
2017-04-24 15:32 ` [Qemu-devel] [PULL 4/4] tests: Add a tester for HMP commands Dr. David Alan Gilbert (git)
@ 2017-04-24 16:50 ` Peter Maydell
2017-04-24 16:57 ` Dr. David Alan Gilbert
4 siblings, 1 reply; 12+ messages in thread
From: Peter Maydell @ 2017-04-24 16:50 UTC (permalink / raw)
To: Dr. David Alan Gilbert (git); +Cc: QEMU Developers, Paolo Bonzini, Thomas Huth
On 24 April 2017 at 16:32, Dr. David Alan Gilbert (git)
<dgilbert@redhat.com> wrote:
> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>
> The following changes since commit 4c55b1d0bad8a703f0499fe62e3761a0cd288da3:
>
> Merge remote-tracking branch 'remotes/armbru/tags/pull-error-2017-04-24' into staging (2017-04-24 14:49:48 +0100)
>
> are available in the git repository at:
>
> git://github.com/dagrh/qemu.git tags/pull-hmp-20170424
>
> for you to fetch changes up to e4e3992e626c4cc7514b271807c90f587771c646:
>
> tests: Add a tester for HMP commands (2017-04-24 15:55:35 +0100)
>
> ----------------------------------------------------------------
> HMP pull
>
> ----------------------------------------------------------------
clang doesn't like some code in test-hmp.c:
/home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:138:9: error:
logical not is only applied to the left hand side of this comparison
[-Werror,-Wlogical-not-parentheses]
if (!strcmp("isapc", mname) == 0 || !strcmp("puv3", mname)
^ ~~
/home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:138:9: note:
add parentheses after the '!' to evaluate the comparison first
if (!strcmp("isapc", mname) == 0 || !strcmp("puv3", mname)
^
( )
/home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:138:9: note:
add parentheses around left hand side expression to silence this
warning
if (!strcmp("isapc", mname) == 0 || !strcmp("puv3", mname)
^
( )
/home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:140:12: error:
logical not is only applied to the left hand side of this comparison
[-Werror,-Wlogical-not-parentheses]
|| !strcmp("xenfv", mname) == 0 || !strcmp("xenpv", mname)) {
^ ~~
/home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:140:12: note:
add parentheses after the '!' to evaluate the comparison first
|| !strcmp("xenfv", mname) == 0 || !strcmp("xenpv", mname)) {
^
( )
/home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:140:12: note:
add parentheses around left hand side expression to silence this
warning
|| !strcmp("xenfv", mname) == 0 || !strcmp("xenpv", mname)) {
^
( )
It does look rather odd:
+ /* Ignore blacklisted machines that have known problems */
+ if (!strcmp("isapc", mname) == 0 || !strcmp("puv3", mname)
+ || !strcmp("tricore_testboard", mname)
+ || !strcmp("xenfv", mname) == 0 || !strcmp("xenpv", mname)) {
+ return;
+ }
since it's not using the same kind of expression to test
each board name -- is that deliberate, or accidental ?
I think this expression means we'll actually skip every machine...
thanks
-- PMM
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PULL 0/4] hmp queue
2017-04-24 16:50 ` [Qemu-devel] [PULL 0/4] hmp queue Peter Maydell
@ 2017-04-24 16:57 ` Dr. David Alan Gilbert
2017-04-25 3:32 ` Thomas Huth
0 siblings, 1 reply; 12+ messages in thread
From: Dr. David Alan Gilbert @ 2017-04-24 16:57 UTC (permalink / raw)
To: Peter Maydell; +Cc: QEMU Developers, Paolo Bonzini, Thomas Huth
* Peter Maydell (peter.maydell@linaro.org) wrote:
> On 24 April 2017 at 16:32, Dr. David Alan Gilbert (git)
> <dgilbert@redhat.com> wrote:
> > From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> >
> > The following changes since commit 4c55b1d0bad8a703f0499fe62e3761a0cd288da3:
> >
> > Merge remote-tracking branch 'remotes/armbru/tags/pull-error-2017-04-24' into staging (2017-04-24 14:49:48 +0100)
> >
> > are available in the git repository at:
> >
> > git://github.com/dagrh/qemu.git tags/pull-hmp-20170424
> >
> > for you to fetch changes up to e4e3992e626c4cc7514b271807c90f587771c646:
> >
> > tests: Add a tester for HMP commands (2017-04-24 15:55:35 +0100)
> >
> > ----------------------------------------------------------------
> > HMP pull
> >
> > ----------------------------------------------------------------
>
>
> clang doesn't like some code in test-hmp.c:
>
> /home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:138:9: error:
> logical not is only applied to the left hand side of this comparison
> [-Werror,-Wlogical-not-parentheses]
> if (!strcmp("isapc", mname) == 0 || !strcmp("puv3", mname)
> ^ ~~
<snip>
> It does look rather odd:
>
> + /* Ignore blacklisted machines that have known problems */
> + if (!strcmp("isapc", mname) == 0 || !strcmp("puv3", mname)
> + || !strcmp("tricore_testboard", mname)
> + || !strcmp("xenfv", mname) == 0 || !strcmp("xenpv", mname)) {
> + return;
> + }
>
> since it's not using the same kind of expression to test
> each board name -- is that deliberate, or accidental ?
>
> I think this expression means we'll actually skip every machine...
Yep, you're right, just tried it with logging.
That's accidental; hmm I should add a clang build somewhere.
Thomas: Do you want to send me a fixed version?
Dave
> thanks
> -- PMM
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PULL 0/4] hmp queue
2017-04-24 16:57 ` Dr. David Alan Gilbert
@ 2017-04-25 3:32 ` Thomas Huth
2017-04-25 5:16 ` [Qemu-devel] [PATCH v3 3/3] tests: Add a tester for HMP commands Thomas Huth
0 siblings, 1 reply; 12+ messages in thread
From: Thomas Huth @ 2017-04-25 3:32 UTC (permalink / raw)
To: Dr. David Alan Gilbert, Peter Maydell; +Cc: QEMU Developers, Paolo Bonzini
On 24.04.2017 18:57, Dr. David Alan Gilbert wrote:
> * Peter Maydell (peter.maydell@linaro.org) wrote:
>> On 24 April 2017 at 16:32, Dr. David Alan Gilbert (git)
>> <dgilbert@redhat.com> wrote:
>>> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>>>
>>> The following changes since commit 4c55b1d0bad8a703f0499fe62e3761a0cd288da3:
>>>
>>> Merge remote-tracking branch 'remotes/armbru/tags/pull-error-2017-04-24' into staging (2017-04-24 14:49:48 +0100)
>>>
>>> are available in the git repository at:
>>>
>>> git://github.com/dagrh/qemu.git tags/pull-hmp-20170424
>>>
>>> for you to fetch changes up to e4e3992e626c4cc7514b271807c90f587771c646:
>>>
>>> tests: Add a tester for HMP commands (2017-04-24 15:55:35 +0100)
>>>
>>> ----------------------------------------------------------------
>>> HMP pull
>>>
>>> ----------------------------------------------------------------
>>
>>
>> clang doesn't like some code in test-hmp.c:
>>
>> /home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:138:9: error:
>> logical not is only applied to the left hand side of this comparison
>> [-Werror,-Wlogical-not-parentheses]
>> if (!strcmp("isapc", mname) == 0 || !strcmp("puv3", mname)
>> ^ ~~
>
> <snip>
>
>> It does look rather odd:
>>
>> + /* Ignore blacklisted machines that have known problems */
>> + if (!strcmp("isapc", mname) == 0 || !strcmp("puv3", mname)
>> + || !strcmp("tricore_testboard", mname)
>> + || !strcmp("xenfv", mname) == 0 || !strcmp("xenpv", mname)) {
>> + return;
>> + }
>>
>> since it's not using the same kind of expression to test
>> each board name -- is that deliberate, or accidental ?
>>
>> I think this expression means we'll actually skip every machine...
>
> Yep, you're right, just tried it with logging.
Ouch, not sure how that happened ... looks like I used
"strcmp("isapc", mname) == 0" in the first version of my patch, and then
wanted to switch to "!strcmp()" when I added the xenfv and xenpv
machines, but forgot to remove the "== 0" everywhere :-( Big sorry for
that mess!
> That's accidental; hmm I should add a clang build somewhere.
>
> Thomas: Do you want to send me a fixed version?
Yes, I'll send a fixed version, where I also correct the memory leak
that you noticed.
Thomas
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH v3 3/3] tests: Add a tester for HMP commands
2017-04-25 3:32 ` Thomas Huth
@ 2017-04-25 5:16 ` Thomas Huth
2017-04-25 9:28 ` Dr. David Alan Gilbert
2017-04-25 13:22 ` Eric Blake
0 siblings, 2 replies; 12+ messages in thread
From: Thomas Huth @ 2017-04-25 5:16 UTC (permalink / raw)
To: Dr. David Alan Gilbert, qemu-devel
HMP commands do not get any automatic testing yet, so on certain
QEMU machines, some HMP commands were causing crashes in the past.
Thus we should test HMP commands in our test suite, too, to avoid
that such problems creep in again in the future.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
v3:
- Fixed the stupid "!strcmp() == 0" problem
- Removed "isapc" from the blacklist since the "info lapic" problem
has already been fixed (see commit c7f15bc93661a36fe)
- Fixed the g_strdup_printf("hmp/%s", mname) memory leak
tests/Makefile.include | 2 +
tests/test-hmp.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 163 insertions(+)
create mode 100644 tests/test-hmp.c
diff --git a/tests/Makefile.include b/tests/Makefile.include
index 579ec07..31931c0 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -331,6 +331,7 @@ check-qtest-xtensaeb-y = $(check-qtest-xtensa-y)
check-qtest-s390x-y = tests/boot-serial-test$(EXESUF)
check-qtest-generic-y += tests/qom-test$(EXESUF)
+check-qtest-generic-y += tests/test-hmp$(EXESUF)
qapi-schema += alternate-any.json
qapi-schema += alternate-array.json
@@ -720,6 +721,7 @@ tests/tpci200-test$(EXESUF): tests/tpci200-test.o
tests/display-vga-test$(EXESUF): tests/display-vga-test.o
tests/ipoctal232-test$(EXESUF): tests/ipoctal232-test.o
tests/qom-test$(EXESUF): tests/qom-test.o
+tests/test-hmp$(EXESUF): tests/test-hmp.o
tests/drive_del-test$(EXESUF): tests/drive_del-test.o $(libqos-pc-obj-y)
tests/qdev-monitor-test$(EXESUF): tests/qdev-monitor-test.o $(libqos-pc-obj-y)
tests/nvme-test$(EXESUF): tests/nvme-test.o
diff --git a/tests/test-hmp.c b/tests/test-hmp.c
new file mode 100644
index 0000000..99e35ec
--- /dev/null
+++ b/tests/test-hmp.c
@@ -0,0 +1,161 @@
+/*
+ * Test HMP commands.
+ *
+ * Copyright (c) 2017 Red Hat Inc.
+ *
+ * Author:
+ * Thomas Huth <thuth@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2
+ * or later. See the COPYING file in the top-level directory.
+ *
+ * This test calls some HMP commands for all machines that the current
+ * QEMU binary provides, to check whether they terminate successfully
+ * (i.e. do not crash QEMU).
+ */
+
+#include "qemu/osdep.h"
+#include "libqtest.h"
+
+static int verbose;
+
+static const char *hmp_cmds[] = {
+ "boot_set ndc",
+ "chardev-add null,id=testchardev1",
+ "chardev-remove testchardev1",
+ "commit all",
+ "cpu-add 1",
+ "cpu 0",
+ "device_add ?",
+ "device_add usb-mouse,id=mouse1",
+ "mouse_button 7",
+ "mouse_move 10 10",
+ "mouse_button 0",
+ "device_del mouse1",
+ "dump-guest-memory /dev/null 0 4096",
+ "gdbserver",
+ "host_net_add user id=net0",
+ "hostfwd_add tcp::43210-:43210",
+ "hostfwd_remove tcp::43210-:43210",
+ "host_net_remove 0 net0",
+ "i /w 0",
+ "log all",
+ "log none",
+ "memsave 0 4096 \"/dev/null\"",
+ "migrate_set_cache_size 1",
+ "migrate_set_downtime 1",
+ "migrate_set_speed 1",
+ "netdev_add user,id=net1",
+ "set_link net1 off",
+ "set_link net1 on",
+ "netdev_del net1",
+ "nmi",
+ "o /w 0 0x1234",
+ "object_add memory-backend-ram,id=mem1,size=256M",
+ "object_del mem1",
+ "pmemsave 0 4096 \"/dev/null\"",
+ "p $pc + 8",
+ "qom-list /",
+ "qom-set /machine initrd test",
+ "screendump /dev/null",
+ "sendkey x",
+ "singlestep on",
+ "wavcapture /dev/null",
+ "stopcapture 0",
+ "sum 0 512",
+ "x /8i 0x100",
+ "xp /16x 0",
+ NULL
+};
+
+/* Run through the list of pre-defined commands */
+static void test_commands(void)
+{
+ char *response;
+ int i;
+
+ for (i = 0; hmp_cmds[i] != NULL; i++) {
+ if (verbose) {
+ fprintf(stderr, "\t%s\n", hmp_cmds[i]);
+ }
+ response = hmp(hmp_cmds[i]);
+ g_free(response);
+ }
+
+}
+
+/* Run through all info commands and call them blindly (without arguments) */
+static void test_info_commands(void)
+{
+ char *resp, *info, *info_buf, *endp;
+
+ info_buf = info = hmp("help info");
+
+ while (*info) {
+ /* Extract the info command, ignore parameters and description */
+ g_assert(strncmp(info, "info ", 5) == 0);
+ endp = strchr(&info[5], ' ');
+ g_assert(endp != NULL);
+ *endp = '\0';
+ /* Now run the info command */
+ if (verbose) {
+ fprintf(stderr, "\t%s\n", info);
+ }
+ resp = hmp(info);
+ g_free(resp);
+ /* And move forward to the next line */
+ info = strchr(endp + 1, '\n');
+ if (!info) {
+ break;
+ }
+ info += 1;
+ }
+
+ g_free(info_buf);
+}
+
+static void test_machine(gconstpointer data)
+{
+ const char *machine = data;
+ char *args;
+
+ args = g_strdup_printf("-S -M %s", machine);
+ qtest_start(args);
+
+ test_info_commands();
+ test_commands();
+
+ qtest_end();
+ g_free(args);
+ g_free((void *)data);
+}
+
+static void add_machine_test_case(const char *mname)
+{
+ char *path;
+
+ /* Ignore blacklisted machines that have known problems */
+ if (!strcmp("puv3", mname) || !strcmp("tricore_testboard", mname) ||
+ !strcmp("xenfv", mname) || !strcmp("xenpv", mname)) {
+ return;
+ }
+
+ path = g_strdup_printf("hmp/%s", mname);
+ qtest_add_data_func(path, g_strdup(mname), test_machine);
+ g_free(path);
+}
+
+int main(int argc, char **argv)
+{
+ char *v_env = getenv("V");
+
+ if (v_env && *v_env >= '2') {
+ verbose = true;
+ }
+
+ g_test_init(&argc, &argv, NULL);
+
+ qtest_cb_for_every_machine(add_machine_test_case);
+
+ return g_test_run();
+}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v3 3/3] tests: Add a tester for HMP commands
2017-04-25 5:16 ` [Qemu-devel] [PATCH v3 3/3] tests: Add a tester for HMP commands Thomas Huth
@ 2017-04-25 9:28 ` Dr. David Alan Gilbert
2017-04-25 13:22 ` Eric Blake
1 sibling, 0 replies; 12+ messages in thread
From: Dr. David Alan Gilbert @ 2017-04-25 9:28 UTC (permalink / raw)
To: Thomas Huth; +Cc: qemu-devel
* Thomas Huth (thuth@redhat.com) wrote:
> HMP commands do not get any automatic testing yet, so on certain
> QEMU machines, some HMP commands were causing crashes in the past.
> Thus we should test HMP commands in our test suite, too, to avoid
> that such problems creep in again in the future.
>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
Thanks,
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
and queued
Dave
> ---
> v3:
> - Fixed the stupid "!strcmp() == 0" problem
> - Removed "isapc" from the blacklist since the "info lapic" problem
> has already been fixed (see commit c7f15bc93661a36fe)
> - Fixed the g_strdup_printf("hmp/%s", mname) memory leak
>
> tests/Makefile.include | 2 +
> tests/test-hmp.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 163 insertions(+)
> create mode 100644 tests/test-hmp.c
>
> diff --git a/tests/Makefile.include b/tests/Makefile.include
> index 579ec07..31931c0 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -331,6 +331,7 @@ check-qtest-xtensaeb-y = $(check-qtest-xtensa-y)
> check-qtest-s390x-y = tests/boot-serial-test$(EXESUF)
>
> check-qtest-generic-y += tests/qom-test$(EXESUF)
> +check-qtest-generic-y += tests/test-hmp$(EXESUF)
>
> qapi-schema += alternate-any.json
> qapi-schema += alternate-array.json
> @@ -720,6 +721,7 @@ tests/tpci200-test$(EXESUF): tests/tpci200-test.o
> tests/display-vga-test$(EXESUF): tests/display-vga-test.o
> tests/ipoctal232-test$(EXESUF): tests/ipoctal232-test.o
> tests/qom-test$(EXESUF): tests/qom-test.o
> +tests/test-hmp$(EXESUF): tests/test-hmp.o
> tests/drive_del-test$(EXESUF): tests/drive_del-test.o $(libqos-pc-obj-y)
> tests/qdev-monitor-test$(EXESUF): tests/qdev-monitor-test.o $(libqos-pc-obj-y)
> tests/nvme-test$(EXESUF): tests/nvme-test.o
> diff --git a/tests/test-hmp.c b/tests/test-hmp.c
> new file mode 100644
> index 0000000..99e35ec
> --- /dev/null
> +++ b/tests/test-hmp.c
> @@ -0,0 +1,161 @@
> +/*
> + * Test HMP commands.
> + *
> + * Copyright (c) 2017 Red Hat Inc.
> + *
> + * Author:
> + * Thomas Huth <thuth@redhat.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2
> + * or later. See the COPYING file in the top-level directory.
> + *
> + * This test calls some HMP commands for all machines that the current
> + * QEMU binary provides, to check whether they terminate successfully
> + * (i.e. do not crash QEMU).
> + */
> +
> +#include "qemu/osdep.h"
> +#include "libqtest.h"
> +
> +static int verbose;
> +
> +static const char *hmp_cmds[] = {
> + "boot_set ndc",
> + "chardev-add null,id=testchardev1",
> + "chardev-remove testchardev1",
> + "commit all",
> + "cpu-add 1",
> + "cpu 0",
> + "device_add ?",
> + "device_add usb-mouse,id=mouse1",
> + "mouse_button 7",
> + "mouse_move 10 10",
> + "mouse_button 0",
> + "device_del mouse1",
> + "dump-guest-memory /dev/null 0 4096",
> + "gdbserver",
> + "host_net_add user id=net0",
> + "hostfwd_add tcp::43210-:43210",
> + "hostfwd_remove tcp::43210-:43210",
> + "host_net_remove 0 net0",
> + "i /w 0",
> + "log all",
> + "log none",
> + "memsave 0 4096 \"/dev/null\"",
> + "migrate_set_cache_size 1",
> + "migrate_set_downtime 1",
> + "migrate_set_speed 1",
> + "netdev_add user,id=net1",
> + "set_link net1 off",
> + "set_link net1 on",
> + "netdev_del net1",
> + "nmi",
> + "o /w 0 0x1234",
> + "object_add memory-backend-ram,id=mem1,size=256M",
> + "object_del mem1",
> + "pmemsave 0 4096 \"/dev/null\"",
> + "p $pc + 8",
> + "qom-list /",
> + "qom-set /machine initrd test",
> + "screendump /dev/null",
> + "sendkey x",
> + "singlestep on",
> + "wavcapture /dev/null",
> + "stopcapture 0",
> + "sum 0 512",
> + "x /8i 0x100",
> + "xp /16x 0",
> + NULL
> +};
> +
> +/* Run through the list of pre-defined commands */
> +static void test_commands(void)
> +{
> + char *response;
> + int i;
> +
> + for (i = 0; hmp_cmds[i] != NULL; i++) {
> + if (verbose) {
> + fprintf(stderr, "\t%s\n", hmp_cmds[i]);
> + }
> + response = hmp(hmp_cmds[i]);
> + g_free(response);
> + }
> +
> +}
> +
> +/* Run through all info commands and call them blindly (without arguments) */
> +static void test_info_commands(void)
> +{
> + char *resp, *info, *info_buf, *endp;
> +
> + info_buf = info = hmp("help info");
> +
> + while (*info) {
> + /* Extract the info command, ignore parameters and description */
> + g_assert(strncmp(info, "info ", 5) == 0);
> + endp = strchr(&info[5], ' ');
> + g_assert(endp != NULL);
> + *endp = '\0';
> + /* Now run the info command */
> + if (verbose) {
> + fprintf(stderr, "\t%s\n", info);
> + }
> + resp = hmp(info);
> + g_free(resp);
> + /* And move forward to the next line */
> + info = strchr(endp + 1, '\n');
> + if (!info) {
> + break;
> + }
> + info += 1;
> + }
> +
> + g_free(info_buf);
> +}
> +
> +static void test_machine(gconstpointer data)
> +{
> + const char *machine = data;
> + char *args;
> +
> + args = g_strdup_printf("-S -M %s", machine);
> + qtest_start(args);
> +
> + test_info_commands();
> + test_commands();
> +
> + qtest_end();
> + g_free(args);
> + g_free((void *)data);
> +}
> +
> +static void add_machine_test_case(const char *mname)
> +{
> + char *path;
> +
> + /* Ignore blacklisted machines that have known problems */
> + if (!strcmp("puv3", mname) || !strcmp("tricore_testboard", mname) ||
> + !strcmp("xenfv", mname) || !strcmp("xenpv", mname)) {
> + return;
> + }
> +
> + path = g_strdup_printf("hmp/%s", mname);
> + qtest_add_data_func(path, g_strdup(mname), test_machine);
> + g_free(path);
> +}
> +
> +int main(int argc, char **argv)
> +{
> + char *v_env = getenv("V");
> +
> + if (v_env && *v_env >= '2') {
> + verbose = true;
> + }
> +
> + g_test_init(&argc, &argv, NULL);
> +
> + qtest_cb_for_every_machine(add_machine_test_case);
> +
> + return g_test_run();
> +}
> --
> 1.8.3.1
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v3 3/3] tests: Add a tester for HMP commands
2017-04-25 5:16 ` [Qemu-devel] [PATCH v3 3/3] tests: Add a tester for HMP commands Thomas Huth
2017-04-25 9:28 ` Dr. David Alan Gilbert
@ 2017-04-25 13:22 ` Eric Blake
2017-04-27 4:50 ` Thomas Huth
1 sibling, 1 reply; 12+ messages in thread
From: Eric Blake @ 2017-04-25 13:22 UTC (permalink / raw)
To: Thomas Huth, Dr. David Alan Gilbert, qemu-devel
[-- Attachment #1: Type: text/plain, Size: 813 bytes --]
On 04/25/2017 12:16 AM, Thomas Huth wrote:
> HMP commands do not get any automatic testing yet, so on certain
> QEMU machines, some HMP commands were causing crashes in the past.
> Thus we should test HMP commands in our test suite, too, to avoid
> that such problems creep in again in the future.
>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
> v3:
> - Fixed the stupid "!strcmp() == 0" problem
That's why libvirt prefers the use of a STREQ() macro (it's easier to
read STREQ(a,b) than it is to remember if !strcmp(a,b) has the right
semantics). But switching the code base to use such a nice wrapper
would be a task for Coccinelle, if we wanted it.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization: qemu.org | libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v3 3/3] tests: Add a tester for HMP commands
2017-04-25 13:22 ` Eric Blake
@ 2017-04-27 4:50 ` Thomas Huth
0 siblings, 0 replies; 12+ messages in thread
From: Thomas Huth @ 2017-04-27 4:50 UTC (permalink / raw)
To: Eric Blake, Dr. David Alan Gilbert, qemu-devel
[-- Attachment #1: Type: text/plain, Size: 932 bytes --]
On 25.04.2017 15:22, Eric Blake wrote:
> On 04/25/2017 12:16 AM, Thomas Huth wrote:
>> HMP commands do not get any automatic testing yet, so on certain
>> QEMU machines, some HMP commands were causing crashes in the past.
>> Thus we should test HMP commands in our test suite, too, to avoid
>> that such problems creep in again in the future.
>>
>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>> ---
>> v3:
>> - Fixed the stupid "!strcmp() == 0" problem
>
> That's why libvirt prefers the use of a STREQ() macro (it's easier to
> read STREQ(a,b) than it is to remember if !strcmp(a,b) has the right
> semantics). But switching the code base to use such a nice wrapper
> would be a task for Coccinelle, if we wanted it.
I just saw that glib seems also to have a g_str_equal() function ... I
guess we could use that in QEMU instead. I'll try to remember that for
future code that I write ...
Thomas
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2017-04-27 4:50 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-04-24 15:32 [Qemu-devel] [PULL 0/4] hmp queue Dr. David Alan Gilbert (git)
2017-04-24 15:32 ` [Qemu-devel] [PULL 1/4] hmp: gpa2hva and gpa2hpa hostaddr command Dr. David Alan Gilbert (git)
2017-04-24 15:32 ` [Qemu-devel] [PULL 2/4] libqtest: Ignore QMP events when parsing the response for HMP commands Dr. David Alan Gilbert (git)
2017-04-24 15:32 ` [Qemu-devel] [PULL 3/4] libqtest: Add a generic function to run a callback function for every machine Dr. David Alan Gilbert (git)
2017-04-24 15:32 ` [Qemu-devel] [PULL 4/4] tests: Add a tester for HMP commands Dr. David Alan Gilbert (git)
2017-04-24 16:50 ` [Qemu-devel] [PULL 0/4] hmp queue Peter Maydell
2017-04-24 16:57 ` Dr. David Alan Gilbert
2017-04-25 3:32 ` Thomas Huth
2017-04-25 5:16 ` [Qemu-devel] [PATCH v3 3/3] tests: Add a tester for HMP commands Thomas Huth
2017-04-25 9:28 ` Dr. David Alan Gilbert
2017-04-25 13:22 ` Eric Blake
2017-04-27 4:50 ` Thomas Huth
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).