* [PATCH for-7.0 1/4] tests/qtest: Run the PPC 32-bit tests with the 64-bit target binary, too
2021-12-01 10:43 [PATCH for-7.0 0/4] qtest patches for binaries with reduced machines Thomas Huth
@ 2021-12-01 10:43 ` Thomas Huth
2021-12-01 10:43 ` [PATCH for-7.0 2/4] tests/qtest: Fence the tests that need xlnx-zcu102 with CONFIG_XLNX_ZYNQMP_ARM Thomas Huth
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Thomas Huth @ 2021-12-01 10:43 UTC (permalink / raw)
To: qemu-devel, Laurent Vivier; +Cc: Paolo Bonzini, John Snow
The ppc64 target is a superset of the 32-bit target, so we should
include the tests here, too. This used to be done in the past already,
but it got lost during the conversion to meson.
Fixes: a2ce7dbd91 ("meson: convert tests/qtest to meson")
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
tests/qtest/meson.build | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index c9d8458062..8591a54439 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -134,6 +134,7 @@ qtests_ppc = \
['boot-order-test', 'prom-env-test', 'boot-serial-test'] \
qtests_ppc64 = \
+ qtests_ppc + \
(config_all_devices.has_key('CONFIG_PSERIES') ? ['device-plug-test'] : []) + \
(config_all_devices.has_key('CONFIG_POWERNV') ? ['pnv-xscom-test'] : []) + \
(config_all_devices.has_key('CONFIG_PSERIES') ? ['rtas-test'] : []) + \
--
2.27.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH for-7.0 2/4] tests/qtest: Fence the tests that need xlnx-zcu102 with CONFIG_XLNX_ZYNQMP_ARM
2021-12-01 10:43 [PATCH for-7.0 0/4] qtest patches for binaries with reduced machines Thomas Huth
2021-12-01 10:43 ` [PATCH for-7.0 1/4] tests/qtest: Run the PPC 32-bit tests with the 64-bit target binary, too Thomas Huth
@ 2021-12-01 10:43 ` Thomas Huth
2021-12-01 10:43 ` [PATCH for-7.0 3/4] tests/qtest: Add a function that gets a list with available machine types Thomas Huth
2021-12-01 10:43 ` [PATCH for-7.0 4/4] tests/qtest: Add a function to check whether a machine is available Thomas Huth
3 siblings, 0 replies; 6+ messages in thread
From: Thomas Huth @ 2021-12-01 10:43 UTC (permalink / raw)
To: qemu-devel, Laurent Vivier; +Cc: Paolo Bonzini, John Snow
The 'xlnx-can-test' and the 'fuzz-xlnx-dp-test' need the "xlnx-zcu102"
machine and thus should only be built and run if CONFIG_XLNX_ZYNQMP_ARM
is enabled.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
tests/qtest/meson.build | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 8591a54439..5260b33dc0 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -184,11 +184,10 @@ qtests_aarch64 = \
(cpu != 'arm' and unpack_edk2_blobs ? ['bios-tables-test'] : []) + \
(config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? ['tpm-tis-device-test'] : []) + \
(config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? ['tpm-tis-device-swtpm-test'] : []) + \
+ (config_all_devices.has_key('CONFIG_XLNX_ZYNQMP_ARM') ? ['xlnx-can-test', 'fuzz-xlnx-dp-test'] : []) + \
['arm-cpu-features',
'numa-test',
'boot-serial-test',
- 'xlnx-can-test',
- 'fuzz-xlnx-dp-test',
'migration-test']
qtests_s390x = \
--
2.27.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH for-7.0 3/4] tests/qtest: Add a function that gets a list with available machine types
2021-12-01 10:43 [PATCH for-7.0 0/4] qtest patches for binaries with reduced machines Thomas Huth
2021-12-01 10:43 ` [PATCH for-7.0 1/4] tests/qtest: Run the PPC 32-bit tests with the 64-bit target binary, too Thomas Huth
2021-12-01 10:43 ` [PATCH for-7.0 2/4] tests/qtest: Fence the tests that need xlnx-zcu102 with CONFIG_XLNX_ZYNQMP_ARM Thomas Huth
@ 2021-12-01 10:43 ` Thomas Huth
2021-12-01 10:43 ` [PATCH for-7.0 4/4] tests/qtest: Add a function to check whether a machine is available Thomas Huth
3 siblings, 0 replies; 6+ messages in thread
From: Thomas Huth @ 2021-12-01 10:43 UTC (permalink / raw)
To: qemu-devel, Laurent Vivier; +Cc: Paolo Bonzini, John Snow
For the upcoming patches, we will need a way to gets a list with all
available machine types. Refactor the qtest_cb_for_every_machine()
to split the related code out into a separate new function, and
gather the aliases of the various machine types, too.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
tests/qtest/libqtest.c | 64 ++++++++++++++++++++++++++++++++++--------
1 file changed, 53 insertions(+), 11 deletions(-)
diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
index 25aeea385b..7ae2dc4e1d 100644
--- a/tests/qtest/libqtest.c
+++ b/tests/qtest/libqtest.c
@@ -1321,16 +1321,29 @@ static bool qtest_is_old_versioned_machine(const char *mname)
return res;
}
-void qtest_cb_for_every_machine(void (*cb)(const char *machine),
- bool skip_old_versioned)
+struct MachInfo {
+ char *name;
+ char *alias;
+};
+
+/*
+ * Returns an array with pointers to the available machine names.
+ * The terminating entry has the name set to NULL.
+ */
+static struct MachInfo *qtest_get_machines(void)
{
+ static struct MachInfo *machines;
QDict *response, *minfo;
QList *list;
const QListEntry *p;
QObject *qobj;
QString *qstr;
- const char *mname;
QTestState *qts;
+ int idx;
+
+ if (machines) {
+ return machines;
+ }
qts = qtest_init("-machine none");
response = qtest_qmp(qts, "{ 'execute': 'query-machines' }");
@@ -1338,25 +1351,54 @@ void qtest_cb_for_every_machine(void (*cb)(const char *machine),
list = qdict_get_qlist(response, "return");
g_assert(list);
- for (p = qlist_first(list); p; p = qlist_next(p)) {
+ machines = g_new(struct MachInfo, qlist_size(list) + 1);
+
+ for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) {
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);
- /* Ignore machines that cannot be used for qtests */
- if (!strncmp("xenfv", mname, 5) || g_str_equal("xenpv", mname)) {
- continue;
- }
- if (!skip_old_versioned || !qtest_is_old_versioned_machine(mname)) {
- cb(mname);
+ machines[idx].name = g_strdup(qstring_get_str(qstr));
+
+ qobj = qdict_get(minfo, "alias");
+ if (qobj) { /* The alias is optional */
+ qstr = qobject_to(QString, qobj);
+ g_assert(qstr);
+ machines[idx].alias = g_strdup(qstring_get_str(qstr));
+ } else {
+ machines[idx].alias = NULL;
}
}
qtest_quit(qts);
qobject_unref(response);
+
+ memset(&machines[idx], 0, sizeof(struct MachInfo)); /* Terminating entry */
+ return machines;
+}
+
+void qtest_cb_for_every_machine(void (*cb)(const char *machine),
+ bool skip_old_versioned)
+{
+ struct MachInfo *machines;
+ int i;
+
+ machines = qtest_get_machines();
+
+ for (i = 0; machines[i].name != NULL; i++) {
+ /* Ignore machines that cannot be used for qtests */
+ if (!strncmp("xenfv", machines[i].name, 5) ||
+ g_str_equal("xenpv", machines[i].name)) {
+ continue;
+ }
+ if (!skip_old_versioned ||
+ !qtest_is_old_versioned_machine(machines[i].name)) {
+ cb(machines[i].name);
+ }
+ }
}
/*
--
2.27.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH for-7.0 4/4] tests/qtest: Add a function to check whether a machine is available
2021-12-01 10:43 [PATCH for-7.0 0/4] qtest patches for binaries with reduced machines Thomas Huth
` (2 preceding siblings ...)
2021-12-01 10:43 ` [PATCH for-7.0 3/4] tests/qtest: Add a function that gets a list with available machine types Thomas Huth
@ 2021-12-01 10:43 ` Thomas Huth
2021-12-06 20:02 ` John Snow
3 siblings, 1 reply; 6+ messages in thread
From: Thomas Huth @ 2021-12-01 10:43 UTC (permalink / raw)
To: qemu-devel, Laurent Vivier; +Cc: Paolo Bonzini, John Snow
It is nowadays possible to build QEMU with a reduced set of machines
in each binary. However, the qtests still hard-code the expected
machines and fail if the binary does not feature the required machine.
Let's get a little bit more flexible here: Add a function that can be
used to query whether a certain machine is available or not, and use
it in some tests as an example (more work has to be done in other
tests which will follow later).
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
tests/qtest/boot-serial-test.c | 3 ++-
tests/qtest/cdrom-test.c | 8 +++++---
tests/qtest/libqos/libqtest.h | 8 ++++++++
tests/qtest/libqtest.c | 17 +++++++++++++++++
tests/qtest/prom-env-test.c | 8 +++++---
5 files changed, 37 insertions(+), 7 deletions(-)
diff --git a/tests/qtest/boot-serial-test.c b/tests/qtest/boot-serial-test.c
index 83828ba270..4d8e1343bd 100644
--- a/tests/qtest/boot-serial-test.c
+++ b/tests/qtest/boot-serial-test.c
@@ -285,7 +285,8 @@ int main(int argc, char *argv[])
g_test_init(&argc, &argv, NULL);
for (i = 0; tests[i].arch != NULL; i++) {
- if (strcmp(arch, tests[i].arch) == 0) {
+ if (g_str_equal(arch, tests[i].arch) &&
+ qtest_has_machine(tests[i].machine)) {
char *name = g_strdup_printf("boot-serial/%s", tests[i].machine);
qtest_add_data_func(name, &tests[i], test_machine);
g_free(name);
diff --git a/tests/qtest/cdrom-test.c b/tests/qtest/cdrom-test.c
index 5af944a5fb..c1fcac5c45 100644
--- a/tests/qtest/cdrom-test.c
+++ b/tests/qtest/cdrom-test.c
@@ -109,9 +109,11 @@ static void test_cdrom_param(gconstpointer data)
static void add_cdrom_param_tests(const char **machines)
{
while (*machines) {
- char *testname = g_strdup_printf("cdrom/param/%s", *machines);
- qtest_add_data_func(testname, *machines, test_cdrom_param);
- g_free(testname);
+ if (qtest_has_machine(*machines)) {
+ char *testname = g_strdup_printf("cdrom/param/%s", *machines);
+ qtest_add_data_func(testname, *machines, test_cdrom_param);
+ g_free(testname);
+ }
machines++;
}
}
diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h
index 59e9271195..dff6b31cf0 100644
--- a/tests/qtest/libqos/libqtest.h
+++ b/tests/qtest/libqos/libqtest.h
@@ -710,6 +710,14 @@ QDict *qmp_fd(int fd, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
void qtest_cb_for_every_machine(void (*cb)(const char *machine),
bool skip_old_versioned);
+/**
+ * qtest_has_machine:
+ * @machine: The machine to look for
+ *
+ * Returns: true if the machine is available in the target binary.
+ */
+bool qtest_has_machine(const char *machine);
+
/**
* qtest_qmp_device_add_qdict:
* @qts: QTestState instance to operate on
diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
index 7ae2dc4e1d..65ed949685 100644
--- a/tests/qtest/libqtest.c
+++ b/tests/qtest/libqtest.c
@@ -1401,6 +1401,23 @@ void qtest_cb_for_every_machine(void (*cb)(const char *machine),
}
}
+bool qtest_has_machine(const char *machine)
+{
+ struct MachInfo *machines;
+ int i;
+
+ machines = qtest_get_machines();
+
+ for (i = 0; machines[i].name != NULL; i++) {
+ if (g_str_equal(machine, machines[i].name) ||
+ (machines[i].alias && g_str_equal(machine, machines[i].alias))) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
/*
* Generic hot-plugging test via the device_add QMP commands.
*/
diff --git a/tests/qtest/prom-env-test.c b/tests/qtest/prom-env-test.c
index f41d80154a..bdbb01d8e5 100644
--- a/tests/qtest/prom-env-test.c
+++ b/tests/qtest/prom-env-test.c
@@ -71,9 +71,11 @@ static void add_tests(const char *machines[])
char *name;
for (i = 0; machines[i] != NULL; i++) {
- name = g_strdup_printf("prom-env/%s", machines[i]);
- qtest_add_data_func(name, machines[i], test_machine);
- g_free(name);
+ if (qtest_has_machine(machines[i])) {
+ name = g_strdup_printf("prom-env/%s", machines[i]);
+ qtest_add_data_func(name, machines[i], test_machine);
+ g_free(name);
+ }
}
}
--
2.27.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH for-7.0 4/4] tests/qtest: Add a function to check whether a machine is available
2021-12-01 10:43 ` [PATCH for-7.0 4/4] tests/qtest: Add a function to check whether a machine is available Thomas Huth
@ 2021-12-06 20:02 ` John Snow
0 siblings, 0 replies; 6+ messages in thread
From: John Snow @ 2021-12-06 20:02 UTC (permalink / raw)
To: Thomas Huth; +Cc: Laurent Vivier, Paolo Bonzini, qemu-devel
[-- Attachment #1: Type: text/plain, Size: 4797 bytes --]
On Wed, Dec 1, 2021 at 5:44 AM Thomas Huth <thuth@redhat.com> wrote:
> It is nowadays possible to build QEMU with a reduced set of machines
> in each binary. However, the qtests still hard-code the expected
> machines and fail if the binary does not feature the required machine.
> Let's get a little bit more flexible here: Add a function that can be
> used to query whether a certain machine is available or not, and use
> it in some tests as an example (more work has to be done in other
> tests which will follow later).
>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
> tests/qtest/boot-serial-test.c | 3 ++-
> tests/qtest/cdrom-test.c | 8 +++++---
> tests/qtest/libqos/libqtest.h | 8 ++++++++
> tests/qtest/libqtest.c | 17 +++++++++++++++++
> tests/qtest/prom-env-test.c | 8 +++++---
> 5 files changed, 37 insertions(+), 7 deletions(-)
>
> diff --git a/tests/qtest/boot-serial-test.c
> b/tests/qtest/boot-serial-test.c
> index 83828ba270..4d8e1343bd 100644
> --- a/tests/qtest/boot-serial-test.c
> +++ b/tests/qtest/boot-serial-test.c
> @@ -285,7 +285,8 @@ int main(int argc, char *argv[])
> g_test_init(&argc, &argv, NULL);
>
> for (i = 0; tests[i].arch != NULL; i++) {
> - if (strcmp(arch, tests[i].arch) == 0) {
> + if (g_str_equal(arch, tests[i].arch) &&
> + qtest_has_machine(tests[i].machine)) {
> char *name = g_strdup_printf("boot-serial/%s",
> tests[i].machine);
> qtest_add_data_func(name, &tests[i], test_machine);
> g_free(name);
> diff --git a/tests/qtest/cdrom-test.c b/tests/qtest/cdrom-test.c
> index 5af944a5fb..c1fcac5c45 100644
> --- a/tests/qtest/cdrom-test.c
> +++ b/tests/qtest/cdrom-test.c
> @@ -109,9 +109,11 @@ static void test_cdrom_param(gconstpointer data)
> static void add_cdrom_param_tests(const char **machines)
> {
> while (*machines) {
> - char *testname = g_strdup_printf("cdrom/param/%s", *machines);
> - qtest_add_data_func(testname, *machines, test_cdrom_param);
> - g_free(testname);
> + if (qtest_has_machine(*machines)) {
> + char *testname = g_strdup_printf("cdrom/param/%s", *machines);
> + qtest_add_data_func(testname, *machines, test_cdrom_param);
> + g_free(testname);
> + }
> machines++;
> }
> }
> diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h
> index 59e9271195..dff6b31cf0 100644
> --- a/tests/qtest/libqos/libqtest.h
> +++ b/tests/qtest/libqos/libqtest.h
> @@ -710,6 +710,14 @@ QDict *qmp_fd(int fd, const char *fmt, ...)
> GCC_FMT_ATTR(2, 3);
> void qtest_cb_for_every_machine(void (*cb)(const char *machine),
> bool skip_old_versioned);
>
> +/**
> + * qtest_has_machine:
> + * @machine: The machine to look for
> + *
> + * Returns: true if the machine is available in the target binary.
> + */
> +bool qtest_has_machine(const char *machine);
> +
> /**
> * qtest_qmp_device_add_qdict:
> * @qts: QTestState instance to operate on
> diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
> index 7ae2dc4e1d..65ed949685 100644
> --- a/tests/qtest/libqtest.c
> +++ b/tests/qtest/libqtest.c
> @@ -1401,6 +1401,23 @@ void qtest_cb_for_every_machine(void (*cb)(const
> char *machine),
> }
> }
>
> +bool qtest_has_machine(const char *machine)
> +{
> + struct MachInfo *machines;
> + int i;
> +
> + machines = qtest_get_machines();
> +
> + for (i = 0; machines[i].name != NULL; i++) {
> + if (g_str_equal(machine, machines[i].name) ||
> + (machines[i].alias && g_str_equal(machine,
> machines[i].alias))) {
> + return true;
> + }
> + }
> +
> + return false;
> +}
> +
> /*
> * Generic hot-plugging test via the device_add QMP commands.
> */
> diff --git a/tests/qtest/prom-env-test.c b/tests/qtest/prom-env-test.c
> index f41d80154a..bdbb01d8e5 100644
> --- a/tests/qtest/prom-env-test.c
> +++ b/tests/qtest/prom-env-test.c
> @@ -71,9 +71,11 @@ static void add_tests(const char *machines[])
> char *name;
>
> for (i = 0; machines[i] != NULL; i++) {
> - name = g_strdup_printf("prom-env/%s", machines[i]);
> - qtest_add_data_func(name, machines[i], test_machine);
> - g_free(name);
> + if (qtest_has_machine(machines[i])) {
> + name = g_strdup_printf("prom-env/%s", machines[i]);
> + qtest_add_data_func(name, machines[i], test_machine);
> + g_free(name);
> + }
> }
> }
>
>
I wonder if the arch-specific CDROM tests should be split out into their
own file, because IIRC it's not really about testing the *cdrom* itself,
it's just a test that uses the CDROM.
Eh.
cdrom test bits: Acked-by: John Snow <jsnow@redhat.com>
--js
[-- Attachment #2: Type: text/html, Size: 5959 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread