Commit 4d82d8cf07 for qemu.org
commit 4d82d8cf07b911b90b56b8e86054e55c9244ebca
Author: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
Date: Sat Oct 24 06:16:09 2026 +0000
test/unit/multi-target: check QOM types can be initialized with any target
Currently, we are initializing QOM type after having set target to the
first one available. That's not enough to catch conflicts among types
within targets. Indeed, we'll miss some conflicts since some types are
registered conditionnally through .is_available.
To ensure full coverage, we detect all targets available, and generate a
sub test for each of them. Then, using g_test_trap_subprocess(), we can
recursively call only this test in a children process.
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Link: https://lore.kernel.org/qemu-devel/20261024061616.27381-4-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
diff --git a/tests/unit/test-multi-target.c b/tests/unit/test-multi-target.c
index 89b55bb163..c7559827a0 100644
--- a/tests/unit/test-multi-target.c
+++ b/tests/unit/test-multi-target.c
@@ -30,13 +30,20 @@
/* stub for system/main.c */
int (*qemu_main)(void);
-static void test_qom_types_are_unique(void)
+static void test_qom_types_are_unique(const void *data)
{
- module_call_init(MODULE_INIT_TARGET_INFO);
- g_autoptr(GSList) targets = object_class_get_list(TYPE_TARGET_INFO, false);
- g_assert(targets);
- const TargetInfo *first_ti = TARGET_INFO_CLASS(targets->data)->target_info;
- target_info_qom_set_target_info(first_ti);
+ const TargetInfo *ti = data;
+
+ /* QOM types can be initialized only once, so do it in a subprocess. */
+ if (!g_test_subprocess()) {
+ /* parent process path - respawn this exact test path */
+ g_test_trap_subprocess(NULL, 0, G_TEST_SUBPROCESS_INHERIT_STDERR);
+ g_test_trap_assert_passed();
+ return;
+ }
+ /* child process path */
+
+ target_info_qom_set_target_info(ti);
/* register all types */
module_call_init(MODULE_INIT_QOM);
@@ -47,7 +54,18 @@ static void test_qom_types_are_unique(void)
int main(int argc, char **argv)
{
g_test_init(&argc, &argv, NULL);
- g_test_add_func("/multi-targets/qom-types-are-unique",
- test_qom_types_are_unique);
+
+ module_call_init(MODULE_INIT_TARGET_INFO);
+ g_autoptr(GSList) targets = object_class_get_list_sorted(TYPE_TARGET_INFO,
+ false);
+ g_assert(targets);
+ for (GSList *elem = targets; elem; elem = elem->next) {
+ const TargetInfo *ti = TARGET_INFO_CLASS(elem->data)->target_info;
+ g_autofree char *path =
+ g_strdup_printf("/multi-targets/qom-types-are-unique/%s",
+ ti->target_name);
+ g_test_add_data_func(path, ti, test_qom_types_are_unique);
+ }
+
return g_test_run();
}