@ -43,32 +43,32 @@ static void test_version(QObject *version)
visit_free ( v ) ;
}
static void test_malformed ( void )
static void test_malformed ( QTestState * qts )
{
QDict * resp ;
/* Not even a dictionary */
resp = qmp ( " null " ) ;
resp = qtest_q mp ( qts , " null " ) ;
g_assert_cmpstr ( get_error_class ( resp ) , = = , " GenericError " ) ;
QDECREF ( resp ) ;
/* No "execute" key */
resp = qmp ( " {} " ) ;
resp = qtest_q mp ( qts , " {} " ) ;
g_assert_cmpstr ( get_error_class ( resp ) , = = , " GenericError " ) ;
QDECREF ( resp ) ;
/* "execute" isn't a string */
resp = qmp ( " { 'execute': true } " ) ;
resp = qtest_q mp ( qts , " { 'execute': true } " ) ;
g_assert_cmpstr ( get_error_class ( resp ) , = = , " GenericError " ) ;
QDECREF ( resp ) ;
/* "arguments" isn't a dictionary */
resp = qmp ( " { 'execute': 'no-such-cmd', 'arguments': [] } " ) ;
resp = qtest_q mp ( qts , " { 'execute': 'no-such-cmd', 'arguments': [] } " ) ;
g_assert_cmpstr ( get_error_class ( resp ) , = = , " GenericError " ) ;
QDECREF ( resp ) ;
/* extra key */
resp = qmp ( " { 'execute': 'no-such-cmd', 'extra': true } " ) ;
resp = qtest_q mp ( qts , " { 'execute': 'no-such-cmd', 'extra': true } " ) ;
g_assert_cmpstr ( get_error_class ( resp ) , = = , " GenericError " ) ;
QDECREF ( resp ) ;
}
@ -77,11 +77,12 @@ static void test_qmp_protocol(void)
{
QDict * resp , * q , * ret ;
QList * capabilities ;
QTestState * qts ;
global_ qte st = qtest_init_without_qmp_handshake ( common_args ) ;
qts = qtest_init_without_qmp_handshake ( common_args ) ;
/* Test greeting */
resp = qmp_receive ( ) ;
resp = qtest_q mp_receive ( qts ) ;
q = qdict_get_qdict ( resp , " QMP " ) ;
g_assert ( q ) ;
test_version ( qdict_get ( q , " version " ) ) ;
@ -90,46 +91,46 @@ static void test_qmp_protocol(void)
QDECREF ( resp ) ;
/* Test valid command before handshake */
resp = qmp ( " { 'execute': 'query-version' } " ) ;
resp = qtest_q mp ( qts , " { 'execute': 'query-version' } " ) ;
g_assert_cmpstr ( get_error_class ( resp ) , = = , " CommandNotFound " ) ;
QDECREF ( resp ) ;
/* Test malformed commands before handshake */
test_malformed ( ) ;
test_malformed ( qts ) ;
/* Test handshake */
resp = qmp ( " { 'execute': 'qmp_capabilities' } " ) ;
resp = qtest_q mp ( qts , " { 'execute': 'qmp_capabilities' } " ) ;
ret = qdict_get_qdict ( resp , " return " ) ;
g_assert ( ret & & ! qdict_size ( ret ) ) ;
QDECREF ( resp ) ;
/* Test repeated handshake */
resp = qmp ( " { 'execute': 'qmp_capabilities' } " ) ;
resp = qtest_q mp ( qts , " { 'execute': 'qmp_capabilities' } " ) ;
g_assert_cmpstr ( get_error_class ( resp ) , = = , " CommandNotFound " ) ;
QDECREF ( resp ) ;
/* Test valid command */
resp = qmp ( " { 'execute': 'query-version' } " ) ;
resp = qtest_q mp ( qts , " { 'execute': 'query-version' } " ) ;
test_version ( qdict_get ( resp , " return " ) ) ;
QDECREF ( resp ) ;
/* Test malformed commands */
test_malformed ( ) ;
test_malformed ( qts ) ;
/* Test 'id' */
resp = qmp ( " { 'execute': 'query-name', 'id': 'cookie#1' } " ) ;
resp = qtest_q mp ( qts , " { 'execute': 'query-name', 'id': 'cookie#1' } " ) ;
ret = qdict_get_qdict ( resp , " return " ) ;
g_assert ( ret ) ;
g_assert_cmpstr ( qdict_get_try_str ( resp , " id " ) , = = , " cookie#1 " ) ;
QDECREF ( resp ) ;
/* Test command failure with 'id' */
resp = qmp ( " { 'execute': 'human-monitor-command', 'id': 2 } " ) ;
resp = qtest_q mp ( qts , " { 'execute': 'human-monitor-command', 'id': 2 } " ) ;
g_assert_cmpstr ( get_error_class ( resp ) , = = , " GenericError " ) ;
g_assert_cmpint ( qdict_get_int ( resp , " id " ) , = = , 2 ) ;
QDECREF ( resp ) ;
qtest_end ( ) ;
qtest_quit ( qts ) ;
}
static int query_error_class ( const char * cmd )