On 08/07/2015 10:46 AM, Yang Hongyang wrote: > Using qtest qmp interface to implement following cases: > 1) add/remove netfilter > 2) add a netfilter then delete the netdev > 3) add/remove more than one netfilters > 4) add more than one netfilters and then delete the netdev > > Signed-off-by: Yang Hongyang <yan...@cn.fujitsu.com> > --- > tests/.gitignore | 1 + > tests/Makefile | 2 + > tests/test-netfilter.c | 194 > +++++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 197 insertions(+) > create mode 100644 tests/test-netfilter.c > > diff --git a/tests/.gitignore b/tests/.gitignore > index ccc92e4..395962b 100644 > --- a/tests/.gitignore > +++ b/tests/.gitignore > @@ -41,5 +41,6 @@ test-vmstate > test-write-threshold > test-x86-cpuid > test-xbzrle > +test-netfilter > *-test > qapi-schema/*.test.* > diff --git a/tests/Makefile b/tests/Makefile > index 7494582..e39c7e6 100644 > --- a/tests/Makefile > +++ b/tests/Makefile > @@ -185,6 +185,7 @@ check-qtest-i386-y += tests/pc-cpu-test$(EXESUF) > check-qtest-i386-y += tests/q35-test$(EXESUF) > gcov-files-i386-y += hw/pci-host/q35.c > check-qtest-i386-$(CONFIG_LINUX) += tests/vhost-user-test$(EXESUF) > +check-qtest-i386-y += tests/test-netfilter$(EXESUF) > check-qtest-x86_64-y = $(check-qtest-i386-y) > gcov-files-i386-y += i386-softmmu/hw/timer/mc146818rtc.c > gcov-files-x86_64-y = $(subst > i386-softmmu/,x86_64-softmmu/,$(gcov-files-i386-y)) > @@ -409,6 +410,7 @@ tests/vhost-user-test$(EXESUF): tests/vhost-user-test.o > qemu-char.o qemu-timer.o > tests/qemu-iotests/socket_scm_helper$(EXESUF): > tests/qemu-iotests/socket_scm_helper.o > tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o libqemuutil.a > libqemustub.a > tests/test-write-threshold$(EXESUF): tests/test-write-threshold.o > $(block-obj-y) libqemuutil.a libqemustub.a > +tests/test-netfilter$(EXESUF): tests/test-netfilter.o $(qtest-obj-y) > > ifeq ($(CONFIG_POSIX),y) > LIBS += -lutil > diff --git a/tests/test-netfilter.c b/tests/test-netfilter.c > new file mode 100644 > index 0000000..acbea4c > --- /dev/null > +++ b/tests/test-netfilter.c > @@ -0,0 +1,194 @@ > +/* > + * QTest testcase for netfilter > + * > + * Copyright (c) 2015 FUJITSU LIMITED > + * Author: Yang Hongyang <yan...@cn.fujitsu.com> > + * > + * 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 <glib.h> > +#include "libqtest.h" > + > +/* add a netfilter to a netdev and then remove it */ > +static void add_one_netfilter(void) > +{ > + QDict *response; > + > + response = qmp("{\"execute\": \"netfilter_add\"," > + " \"arguments\": {" > + " \"type\": \"buffer\"," > + " \"id\": \"qtest-f0\"," > + " \"netdev\": \"qtest-bn0\"," > + " \"chain\": \"in\"," > + " \"interval\": \"1000\"" > + "}}");
You can use ' to instead of " in the qmp command: "{'execute': 'netfilter_add', ...}" Thanks Wen Congyang > + > + g_assert(response); > + g_assert(!qdict_haskey(response, "error")); > + QDECREF(response); > + > + response = qmp("{\"execute\": \"netfilter_del\"," > + " \"arguments\": {" > + " \"id\": \"qtest-f0\"" > + "}}"); > + g_assert(response); > + g_assert(!qdict_haskey(response, "error")); > + QDECREF(response); > +} > + > +/* add a netfilter to a netdev and then remove the netdev */ > +static void remove_netdev_with_one_netfilter(void) > +{ > + QDict *response; > + > + response = qmp("{\"execute\": \"netfilter_add\"," > + " \"arguments\": {" > + " \"type\": \"buffer\"," > + " \"id\": \"qtest-f0\"," > + " \"netdev\": \"qtest-bn0\"," > + " \"chain\": \"in\"," > + " \"interval\": \"1000\"" > + "}}"); > + > + g_assert(response); > + g_assert(!qdict_haskey(response, "error")); > + QDECREF(response); > + > + response = qmp("{\"execute\": \"netdev_del\"," > + " \"arguments\": {" > + " \"id\": \"qtest-bn0\"" > + "}}"); > + g_assert(response); > + g_assert(!qdict_haskey(response, "error")); > + QDECREF(response); > + > + /* add back the netdev */ > + response = qmp("{\"execute\": \"netdev_add\"," > + " \"arguments\": {" > + " \"type\": \"user\"," > + " \"id\": \"qtest-bn0\"" > + "}}"); > + g_assert(response); > + g_assert(!qdict_haskey(response, "error")); > + QDECREF(response); > +} > + > +/* add multi(2) netfilters to a netdev and then remove them */ > +static void add_multi_netfilter(void) > +{ > + QDict *response; > + > + response = qmp("{\"execute\": \"netfilter_add\"," > + " \"arguments\": {" > + " \"type\": \"buffer\"," > + " \"id\": \"qtest-f0\"," > + " \"netdev\": \"qtest-bn0\"," > + " \"chain\": \"in\"," > + " \"interval\": \"1000\"" > + "}}"); > + > + g_assert(response); > + g_assert(!qdict_haskey(response, "error")); > + QDECREF(response); > + > + response = qmp("{\"execute\": \"netfilter_add\"," > + " \"arguments\": {" > + " \"type\": \"buffer\"," > + " \"id\": \"qtest-f1\"," > + " \"netdev\": \"qtest-bn0\"," > + " \"chain\": \"in\"," > + " \"interval\": \"1000\"" > + "}}"); > + > + g_assert(response); > + g_assert(!qdict_haskey(response, "error")); > + QDECREF(response); > + > + response = qmp("{\"execute\": \"netfilter_del\"," > + " \"arguments\": {" > + " \"id\": \"qtest-f0\"" > + "}}"); > + g_assert(response); > + g_assert(!qdict_haskey(response, "error")); > + QDECREF(response); > + > + response = qmp("{\"execute\": \"netfilter_del\"," > + " \"arguments\": {" > + " \"id\": \"qtest-f1\"" > + "}}"); > + g_assert(response); > + g_assert(!qdict_haskey(response, "error")); > + QDECREF(response); > +} > + > +/* add multi(2) netfilters to a netdev and then remove the netdev */ > +static void remove_netdev_with_multi_netfilter(void) > +{ > + QDict *response; > + > + response = qmp("{\"execute\": \"netfilter_add\"," > + " \"arguments\": {" > + " \"type\": \"buffer\"," > + " \"id\": \"qtest-f0\"," > + " \"netdev\": \"qtest-bn0\"," > + " \"chain\": \"in\"," > + " \"interval\": \"1000\"" > + "}}"); > + > + g_assert(response); > + g_assert(!qdict_haskey(response, "error")); > + QDECREF(response); > + > + response = qmp("{\"execute\": \"netfilter_add\"," > + " \"arguments\": {" > + " \"type\": \"buffer\"," > + " \"id\": \"qtest-f1\"," > + " \"netdev\": \"qtest-bn0\"," > + " \"chain\": \"in\"," > + " \"interval\": \"1000\"" > + "}}"); > + > + g_assert(response); > + g_assert(!qdict_haskey(response, "error")); > + QDECREF(response); > + > + response = qmp("{\"execute\": \"netdev_del\"," > + " \"arguments\": {" > + " \"id\": \"qtest-bn0\"" > + "}}"); > + g_assert(response); > + g_assert(!qdict_haskey(response, "error")); > + QDECREF(response); > + > + /* add back the netdev */ > + response = qmp("{\"execute\": \"netdev_add\"," > + " \"arguments\": {" > + " \"type\": \"user\"," > + " \"id\": \"qtest-bn0\"" > + "}}"); > + g_assert(response); > + g_assert(!qdict_haskey(response, "error")); > + QDECREF(response); > +} > + > +int main(int argc, char **argv) > +{ > + int ret; > + > + g_test_init(&argc, &argv, NULL); > + qtest_add_func("/netfilter/addremove_one", add_one_netfilter); > + qtest_add_func("/netfilter/remove_netdev_one", > + remove_netdev_with_one_netfilter); > + qtest_add_func("/netfilter/addremove_multi", add_multi_netfilter); > + qtest_add_func("/netfilter/remove_netdev_multi", > + remove_netdev_with_multi_netfilter); > + > + qtest_start("-netdev user,id=qtest-bn0 -device e1000,netdev=qtest-bn0"); > + ret = g_test_run(); > + > + qtest_end(); > + > + return ret; > +} >