/* * QTest testcase for the query-netdev * * Copyright Yandex N.V., 2019 * * This work is licensed under the terms of the GNU GPL, version 2 or later. * See the COPYING file in the top-level directory. * */ #include "qemu/osdep.h" #include "libqos/libqtest.h" #include "qapi/qmp/qdict.h" #include "qapi/qmp/qlist.h" /* * Events can get in the way of responses we are actually waiting for. */ GCC_FMT_ATTR(2, 3) static QObject *wait_command(QTestState *who, const char *command, ...) { va_list ap; QDict *response; QObject *result; va_start(ap, command); qtest_qmp_vsend(who, command, ap); va_end(ap); response = qtest_qmp_receive(who); result = qdict_get(response, "return"); g_assert(result); qobject_ref(result); qobject_unref(response); return result; } static void qmp_query_netdev_no_error(QTestState *qts, size_t netdevs_count) { QObject *resp; QList *netdevs; resp = wait_command(qts, "{'execute': 'query-netdev'}"); netdevs = qobject_to(QList, resp); g_assert(netdevs); g_assert(qlist_size(netdevs) == netdevs_count); qobject_unref(resp); } static void test_query_netdev(void) { const char *arch = qtest_get_arch(); QObject *resp; QTestState *state; /* Choosing machine for platforms without default one */ if (g_str_equal(arch, "arm") || g_str_equal(arch, "aarch64")) { state = qtest_init( "-nodefaults " "-M virt " "-netdev user,id=slirp0"); } else if (g_str_equal(arch, "tricore")) { state = qtest_init( "-nodefaults " "-M tricore_testboard " "-netdev user,id=slirp0"); } else if (g_str_equal(arch, "avr")) { state = qtest_init( "-nodefaults " "-M mega2560 " "-netdev user,id=slirp0"); } else if (g_str_equal(arch, "rx")) { state = qtest_init( "-nodefaults " "-M gdbsim-r5f562n8 " "-netdev user,id=slirp0"); } else { state = qtest_init( "-nodefaults " "-netdev user,id=slirp0"); } g_assert(state); qmp_query_netdev_no_error(state, 1); resp = wait_command(state, "{'execute': 'netdev_add', 'arguments': {" " 'id': 'slirp1'," " 'type': 'user'}}"); qobject_unref(resp); qmp_query_netdev_no_error(state, 2); resp = wait_command(state, "{'execute': 'netdev_del', 'arguments': {" " 'id': 'slirp1'}}"); qobject_unref(resp); qmp_query_netdev_no_error(state, 1); qtest_quit(state); } int main(int argc, char **argv) { int ret = 0; g_test_init(&argc, &argv, NULL); qtest_add_func("/net/qapi/query_netdev", test_query_netdev); ret = g_test_run(); return ret; }