Skip to content

Commit

Permalink
libqtest: add qmp_async
Browse files Browse the repository at this point in the history
Add qmp_async, which lets us send QMP commands asynchronously.
This is useful when we want to send commands that will trigger
event responses, but we don't know in what order to expect them.

Sometimes the event responses may arrive even before the command
confirmation will show up, so it is convenient to leave the responses
in the stream.

Signed-off-by: John Snow <jsnow@redhat.com>
Message-id: 1426018503-821-5-git-send-email-jsnow@redhat.com
  • Loading branch information
jnsnow committed Apr 28, 2015
1 parent 8fe941f commit ba4ed39
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 1 deletion.
30 changes: 29 additions & 1 deletion tests/libqtest.c
Expand Up @@ -388,7 +388,12 @@ QDict *qtest_qmp_receive(QTestState *s)
return qmp.response;
}

QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap)
/**
* Allow users to send a message without waiting for the reply,
* in the case that they choose to discard all replies up until
* a particular EVENT is received.
*/
void qtest_async_qmpv(QTestState *s, const char *fmt, va_list ap)
{
va_list ap_copy;
QObject *qobj;
Expand Down Expand Up @@ -417,6 +422,11 @@ QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap)
QDECREF(qstr);
qobject_decref(qobj);
}
}

QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap)
{
qtest_async_qmpv(s, fmt, ap);

/* Receive reply */
return qtest_qmp_receive(s);
Expand All @@ -433,6 +443,15 @@ QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
return response;
}

void qtest_async_qmp(QTestState *s, const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
qtest_async_qmpv(s, fmt, ap);
va_end(ap);
}

void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list ap)
{
QDict *response = qtest_qmpv(s, fmt, ap);
Expand Down Expand Up @@ -711,6 +730,15 @@ QDict *qmp(const char *fmt, ...)
return response;
}

void qmp_async(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
qtest_async_qmpv(global_qtest, fmt, ap);
va_end(ap);
}

void qmp_discard_response(const char *fmt, ...)
{
va_list ap;
Expand Down
27 changes: 27 additions & 0 deletions tests/libqtest.h
Expand Up @@ -63,6 +63,15 @@ void qtest_qmp_discard_response(QTestState *s, const char *fmt, ...);
*/
QDict *qtest_qmp(QTestState *s, const char *fmt, ...);

/**
* qtest_async_qmp:
* @s: #QTestState instance to operate on.
* @fmt...: QMP message to send to qemu
*
* Sends a QMP message to QEMU and leaves the response in the stream.
*/
void qtest_async_qmp(QTestState *s, const char *fmt, ...);

/**
* qtest_qmpv_discard_response:
* @s: #QTestState instance to operate on.
Expand All @@ -83,6 +92,16 @@ void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list ap);
*/
QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap);

/**
* qtest_async_qmpv:
* @s: #QTestState instance to operate on.
* @fmt: QMP message to send to QEMU
* @ap: QMP message arguments
*
* Sends a QMP message to QEMU and leaves the response in the stream.
*/
void qtest_async_qmpv(QTestState *s, const char *fmt, va_list ap);

/**
* qtest_receive:
* @s: #QTestState instance to operate on.
Expand Down Expand Up @@ -419,6 +438,14 @@ static inline void qtest_end(void)
*/
QDict *qmp(const char *fmt, ...);

/**
* qmp_async:
* @fmt...: QMP message to send to qemu
*
* Sends a QMP message to QEMU and leaves the response in the stream.
*/
void qmp_async(const char *fmt, ...);

/**
* qmp_discard_response:
* @fmt...: QMP message to send to qemu
Expand Down

0 comments on commit ba4ed39

Please sign in to comment.