Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
tests/qtest: add various qtest_qmp_assert_success() variants
Add several counterparts of qtest_qmp_assert_success() that can

 * Use va_list instead of ...
 * Accept a list of FDs to send
 * Return the response data

Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Message-Id: <20230601161347.1803440-2-berrange@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
  • Loading branch information
berrange authored and Juan Quintela committed Jun 2, 2023
1 parent a86d7b9 commit 28760ed
Show file tree
Hide file tree
Showing 2 changed files with 205 additions and 7 deletions.
97 changes: 90 additions & 7 deletions tests/qtest/libqtest.c
Expand Up @@ -1229,24 +1229,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)
{
Expand Down
115 changes: 115 additions & 0 deletions tests/qtest/libqtest.h
Expand Up @@ -693,6 +693,86 @@ void qtest_add_abrt_handler(GHookFunc fn, const void *data);
*/
void qtest_remove_abrt_handler(void *data);

/**
* qtest_vqmp_assert_success_ref:
* @qts: QTestState instance to operate on
* @fmt: QMP message to send to qemu, formatted like
* qobject_from_jsonf_nofail(). See parse_interpolation() for what's
* supported after '%'.
* @args: variable arguments for @fmt
*
* Sends a QMP message to QEMU, asserts that a 'return' key is present in
* the response, and returns the response.
*/
QDict *qtest_vqmp_assert_success_ref(QTestState *qts,
const char *fmt, va_list args)
G_GNUC_PRINTF(2, 0);

/**
* qtest_vqmp_assert_success:
* @qts: QTestState instance to operate on
* @fmt: QMP message to send to qemu, formatted like
* qobject_from_jsonf_nofail(). See parse_interpolation() for what's
* supported after '%'.
* @args: variable arguments for @fmt
*
* Sends a QMP message to QEMU and asserts that a 'return' key is present in
* the response.
*/
void qtest_vqmp_assert_success(QTestState *qts,
const char *fmt, va_list args)
G_GNUC_PRINTF(2, 0);

#ifndef _WIN32
/**
* qtest_vqmp_fds_assert_success_ref:
* @qts: QTestState instance to operate on
* @fds: the file descriptors to send
* @nfds: number of @fds to send
* @fmt: QMP message to send to qemu, formatted like
* qobject_from_jsonf_nofail(). See parse_interpolation() for what's
* supported after '%'.
* @args: variable arguments for @fmt
*
* Sends a QMP message with file descriptors to QEMU,
* asserts that a 'return' key is present in the response,
* and returns the response.
*/
QDict *qtest_vqmp_fds_assert_success_ref(QTestState *qts, int *fds, size_t nfds,
const char *fmt, va_list args)
G_GNUC_PRINTF(4, 0);

/**
* qtest_vqmp_fds_assert_success:
* @qts: QTestState instance to operate on
* @fds: the file descriptors to send
* @nfds: number of @fds to send
* @fmt: QMP message to send to qemu, formatted like
* qobject_from_jsonf_nofail(). See parse_interpolation() for what's
* supported after '%'.
* @args: variable arguments for @fmt
*
* Sends a QMP message with file descriptors to QEMU and
* asserts that a 'return' key is present in the response.
*/
void qtest_vqmp_fds_assert_success(QTestState *qts, int *fds, size_t nfds,
const char *fmt, va_list args)
G_GNUC_PRINTF(4, 0);
#endif /* !_WIN32 */

/**
* qtest_qmp_assert_success_ref:
* @qts: QTestState instance to operate on
* @fmt: QMP message to send to qemu, formatted like
* qobject_from_jsonf_nofail(). See parse_interpolation() for what's
* supported after '%'.
*
* Sends a QMP message to QEMU, asserts that a 'return' key is present in
* the response, and returns the response.
*/
QDict *qtest_qmp_assert_success_ref(QTestState *qts, const char *fmt, ...)
G_GNUC_PRINTF(2, 3);

/**
* qtest_qmp_assert_success:
* @qts: QTestState instance to operate on
Expand All @@ -706,6 +786,41 @@ void qtest_remove_abrt_handler(void *data);
void qtest_qmp_assert_success(QTestState *qts, const char *fmt, ...)
G_GNUC_PRINTF(2, 3);

#ifndef _WIN32
/**
* qtest_qmp_fd_assert_success_ref:
* @qts: QTestState instance to operate on
* @fds: the file descriptors to send
* @nfds: number of @fds to send
* @fmt: QMP message to send to qemu, formatted like
* qobject_from_jsonf_nofail(). See parse_interpolation() for what's
* supported after '%'.
*
* Sends a QMP message with file descriptors to QEMU,
* asserts that a 'return' key is present in the response,
* and returns the response.
*/
QDict *qtest_qmp_fds_assert_success_ref(QTestState *qts, int *fds, size_t nfds,
const char *fmt, ...)
G_GNUC_PRINTF(4, 5);

/**
* qtest_qmp_fd_assert_success:
* @qts: QTestState instance to operate on
* @fds: the file descriptors to send
* @nfds: number of @fds to send
* @fmt: QMP message to send to qemu, formatted like
* qobject_from_jsonf_nofail(). See parse_interpolation() for what's
* supported after '%'.
*
* Sends a QMP message with file descriptors to QEMU and
* asserts that a 'return' key is present in the response.
*/
void qtest_qmp_fds_assert_success(QTestState *qts, int *fds, size_t nfds,
const char *fmt, ...)
G_GNUC_PRINTF(4, 5);
#endif /* !_WIN32 */

/**
* qtest_cb_for_every_machine:
* @cb: Pointer to the callback function
Expand Down

0 comments on commit 28760ed

Please sign in to comment.