aboutsummaryrefslogtreecommitdiff
path: root/tests/qtest/libqtest.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/qtest/libqtest.c')
-rw-r--r--tests/qtest/libqtest.c115
1 files changed, 106 insertions, 9 deletions
diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
index c3a0ef5..77de162 100644
--- a/tests/qtest/libqtest.c
+++ b/tests/qtest/libqtest.c
@@ -82,6 +82,8 @@ struct QTestState
GString *rx;
QTestTransportOps ops;
GList *pending_events;
+ QTestQMPEventCallback eventCB;
+ void *eventData;
};
static GHookList abrt_hooks;
@@ -703,8 +705,13 @@ QDict *qtest_qmp_receive(QTestState *s)
if (!qdict_get_try_str(response, "event")) {
return response;
}
- /* Stash the event for a later consumption */
- s->pending_events = g_list_append(s->pending_events, response);
+
+ if (!s->eventCB ||
+ !s->eventCB(s, qdict_get_str(response, "event"),
+ response, s->eventData)) {
+ /* Stash the event for a later consumption */
+ s->pending_events = g_list_append(s->pending_events, response);
+ }
}
}
@@ -808,6 +815,13 @@ void qtest_qmp_send_raw(QTestState *s, const char *fmt, ...)
va_end(ap);
}
+void qtest_qmp_set_event_callback(QTestState *s,
+ QTestQMPEventCallback cb, void *opaque)
+{
+ s->eventCB = cb;
+ s->eventData = opaque;
+}
+
QDict *qtest_qmp_event_ref(QTestState *s, const char *event)
{
while (s->pending_events) {
@@ -1229,24 +1243,107 @@ void qtest_memset(QTestState *s, uint64_t addr, uint8_t pattern, size_t size)
qtest_rsp(s);
}
-void qtest_qmp_assert_success(QTestState *qts, const char *fmt, ...)
+QDict *qtest_vqmp_assert_success_ref(QTestState *qts,
+ const char *fmt, va_list args)
{
- va_list ap;
QDict *response;
+ QDict *ret;
- va_start(ap, fmt);
- response = qtest_vqmp(qts, fmt, ap);
- va_end(ap);
+ response = qtest_vqmp(qts, fmt, args);
+
+ g_assert(response);
+ if (!qdict_haskey(response, "return")) {
+ g_autoptr(GString) s = qobject_to_json_pretty(QOBJECT(response), true);
+ g_test_message("%s", s->str);
+ }
+ g_assert(qdict_haskey(response, "return"));
+ ret = qdict_get_qdict(response, "return");
+ qobject_ref(ret);
+ qobject_unref(response);
+
+ return ret;
+}
+
+void qtest_vqmp_assert_success(QTestState *qts,
+ const char *fmt, va_list args)
+{
+ QDict *response;
+
+ response = qtest_vqmp_assert_success_ref(qts, fmt, args);
+
+ qobject_unref(response);
+}
+
+#ifndef _WIN32
+QDict *qtest_vqmp_fds_assert_success_ref(QTestState *qts, int *fds, size_t nfds,
+ const char *fmt, va_list args)
+{
+ QDict *response;
+ QDict *ret;
+
+ response = qtest_vqmp_fds(qts, fds, nfds, fmt, args);
g_assert(response);
if (!qdict_haskey(response, "return")) {
- GString *s = qobject_to_json_pretty(QOBJECT(response), true);
+ g_autoptr(GString) s = qobject_to_json_pretty(QOBJECT(response), true);
g_test_message("%s", s->str);
- g_string_free(s, true);
}
g_assert(qdict_haskey(response, "return"));
+ ret = qdict_get_qdict(response, "return");
+ qobject_ref(ret);
+ qobject_unref(response);
+
+ return ret;
+}
+
+void qtest_vqmp_fds_assert_success(QTestState *qts, int *fds, size_t nfds,
+ const char *fmt, va_list args)
+{
+ QDict *response;
+ response = qtest_vqmp_fds_assert_success_ref(qts, fds, nfds, fmt, args);
qobject_unref(response);
}
+#endif /* !_WIN32 */
+
+QDict *qtest_qmp_assert_success_ref(QTestState *qts, const char *fmt, ...)
+{
+ QDict *response;
+ va_list ap;
+ va_start(ap, fmt);
+ response = qtest_vqmp_assert_success_ref(qts, fmt, ap);
+ va_end(ap);
+ return response;
+}
+
+void qtest_qmp_assert_success(QTestState *qts, const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ qtest_vqmp_assert_success(qts, fmt, ap);
+ va_end(ap);
+}
+
+#ifndef _WIN32
+QDict *qtest_qmp_fds_assert_success_ref(QTestState *qts, int *fds, size_t nfds,
+ const char *fmt, ...)
+{
+ QDict *response;
+ va_list ap;
+ va_start(ap, fmt);
+ response = qtest_vqmp_fds_assert_success_ref(qts, fds, nfds, fmt, ap);
+ va_end(ap);
+ return response;
+}
+
+void qtest_qmp_fds_assert_success(QTestState *qts, int *fds, size_t nfds,
+ const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ qtest_vqmp_fds_assert_success(qts, fds, nfds, fmt, ap);
+ va_end(ap);
+}
+#endif /* !_WIN32 */
bool qtest_big_endian(QTestState *s)
{