Commit f2cb867792 for qemu.org
commit f2cb867792ee3eb1e968719b4b72d44627477841
Author: Marc-André Lureau <marcandre.lureau@redhat.com>
Date: Wed Sep 2 17:45:44 2026 +0400
tests/qtest: add qtest_qmp_job_wait()
Add a helper to wait for job conclusion, used in next changes.
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
index 28bb72bfae..370f79a3b6 100644
--- a/tests/qtest/libqtest.c
+++ b/tests/qtest/libqtest.c
@@ -984,6 +984,43 @@ void qtest_qmp_eventwait(QTestState *s, const char *event)
qobject_unref(response);
}
+void qtest_qmp_job_wait(QTestState *s, const char *job_id)
+{
+ QDict *response, *data, *error;
+ QList *jobs;
+ const QListEntry *entry;
+
+ for (;;) {
+ response = qtest_qmp_eventwait_ref(s, "JOB_STATUS_CHANGE");
+ data = qdict_get_qdict(response, "data");
+ if (!strcmp(qdict_get_str(data, "id"), job_id) &&
+ !strcmp(qdict_get_str(data, "status"), "concluded")) {
+ qobject_unref(response);
+ break;
+ }
+ qobject_unref(response);
+ }
+
+ response = qtest_qmp(s, "{ 'execute': 'query-jobs' }");
+ g_assert(qdict_haskey(response, "return"));
+ jobs = qobject_to(QList, qdict_get(response, "return"));
+ g_assert(jobs);
+ QLIST_FOREACH_ENTRY(jobs, entry) {
+ QDict *job = qobject_to(QDict, qlist_entry_obj(entry));
+ if (!strcmp(qdict_get_str(job, "id"), job_id)) {
+ g_assert_null(qdict_get_try_str(job, "error"));
+ break;
+ }
+ }
+ qobject_unref(response);
+
+ response = qtest_qmp(s,
+ "{ 'execute': 'job-dismiss', 'arguments': { 'id': %s } }", job_id);
+ error = qdict_get_qdict(response, "error");
+ g_assert_null(error);
+ qobject_unref(response);
+}
+
char *qtest_vhmp(QTestState *s, const char *fmt, va_list ap)
{
char *cmd;
diff --git a/tests/qtest/libqtest.h b/tests/qtest/libqtest.h
index 58491ca53a..f06e061d21 100644
--- a/tests/qtest/libqtest.h
+++ b/tests/qtest/libqtest.h
@@ -398,6 +398,17 @@ QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event);
*/
QDict *qtest_qmp_event_ref(QTestState *s, const char *event);
+/**
+ * qtest_qmp_job_wait:
+ * @s: #QTestState instance to operate on.
+ * @job_id: job identifier to wait for.
+ *
+ * Wait for a QMP job to reach "concluded" status by consuming
+ * JOB_STATUS_CHANGE events, then dismiss the job.
+ * Asserts that the job completed without error.
+ */
+void qtest_qmp_job_wait(QTestState *s, const char *job_id);
+
/**
* qtest_hmp:
* @s: #QTestState instance to operate on.