diff mbox

[V5,2/2] tests/test-filter-mirror:add filter-mirror unit test

Message ID 1456228821-9684-3-git-send-email-zhangchen.fnst@cn.fujitsu.com (mailing list archive)
State New, archived
Headers show

Commit Message

Zhang Chen Feb. 23, 2016, noon UTC
In this unit test we will test the mirror function.

start qemu with:
     -netdev socket,id=qtest-bn0,fd=sockfd
     -device e1000,netdev=qtest-bn0,id=qtest-e0
     -chardev socket,id=mirror0,path=/tmp/filter-mirror-test.sock,server,nowait
     -object filter-mirror,id=qtest-f0,netdev=qtest-bn0,queue=tx,outdev=mirror0

We inject packet to netdev socket id = qtest-bn0,
filter-mirror will copy and mirror the packet to mirror0.
we read packet from mirror0 and then compare to what we inject.

Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
---
 tests/.gitignore           |  1 +
 tests/Makefile             |  2 ++
 tests/test-filter-mirror.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 90 insertions(+)
 create mode 100644 tests/test-filter-mirror.c

Comments

Jason Wang Feb. 24, 2016, 3:24 a.m. UTC | #1
On 02/23/2016 08:00 PM, Zhang Chen wrote:
> In this unit test we will test the mirror function.
>
> start qemu with:
>      -netdev socket,id=qtest-bn0,fd=sockfd
>      -device e1000,netdev=qtest-bn0,id=qtest-e0
>      -chardev socket,id=mirror0,path=/tmp/filter-mirror-test.sock,server,nowait
>      -object filter-mirror,id=qtest-f0,netdev=qtest-bn0,queue=tx,outdev=mirror0
>
> We inject packet to netdev socket id = qtest-bn0,
> filter-mirror will copy and mirror the packet to mirror0.
> we read packet from mirror0 and then compare to what we inject.
>
> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
> ---
>  tests/.gitignore           |  1 +
>  tests/Makefile             |  2 ++
>  tests/test-filter-mirror.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 90 insertions(+)
>  create mode 100644 tests/test-filter-mirror.c
>
> diff --git a/tests/.gitignore b/tests/.gitignore
> index 787c95c..10df017 100644
> --- a/tests/.gitignore
> +++ b/tests/.gitignore
> @@ -63,5 +63,6 @@ test-write-threshold
>  test-x86-cpuid
>  test-xbzrle
>  test-netfilter
> +test-filter-mirror
>  *-test
>  qapi-schema/*.test.*
> diff --git a/tests/Makefile b/tests/Makefile
> index 650e654..e56c514 100644
> --- a/tests/Makefile
> +++ b/tests/Makefile
> @@ -212,6 +212,7 @@ ifeq ($(CONFIG_VHOST_NET_TEST_i386),)
>  check-qtest-x86_64-$(CONFIG_VHOST_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
>  endif
>  check-qtest-i386-y += tests/test-netfilter$(EXESUF)
> +check-qtest-i386-y += tests/test-filter-mirror$(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))
> @@ -563,6 +564,7 @@ tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_hel
>  tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o $(test-util-obj-y)
>  tests/test-write-threshold$(EXESUF): tests/test-write-threshold.o $(test-block-obj-y)
>  tests/test-netfilter$(EXESUF): tests/test-netfilter.o $(qtest-obj-y)
> +tests/test-filter-mirror$(EXESUF): tests/test-filter-mirror.o $(qtest-obj-y)
>  tests/ivshmem-test$(EXESUF): tests/ivshmem-test.o contrib/ivshmem-server/ivshmem-server.o $(libqos-pc-obj-y)
>  tests/vhost-user-bridge$(EXESUF): tests/vhost-user-bridge.o
>  
> diff --git a/tests/test-filter-mirror.c b/tests/test-filter-mirror.c
> new file mode 100644
> index 0000000..23dd7c0
> --- /dev/null
> +++ b/tests/test-filter-mirror.c
> @@ -0,0 +1,87 @@
> +/*
> + * QTest testcase for filter-mirror
> + *
> + * Copyright (c) 2016 FUJITSU LIMITED
> + * Author: Zhang Chen <zhangchen.fnst@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"
> +#include "qemu/iov.h"
> +#include "qemu/sockets.h"
> +#include "qemu/error-report.h"
> +#include "qemu/main-loop.h"
> +
> +#define SOCK_PATH "/tmp/filter-mirror-test.sock"
> +
> +static void test_mirror(void)
> +{
> +#ifndef _WIN32
> +/* socketpair(PF_UNIX) which does not exist on windows */
> +
> +    int send_sock[2], recv_sock;
> +    char *cmdline;
> +    uint32_t ret = 0, len = 0;
> +    char send_buf[] = "Hello! filter-mirror~";
> +    char *recv_buf;
> +    uint32_t size = sizeof(send_buf);
> +    size = htonl(size);
> +
> +    ret = socketpair(PF_UNIX, SOCK_STREAM, 0, send_sock);
> +    g_assert_cmpint(ret, !=, -1);
> +
> +    cmdline = g_strdup_printf("-netdev socket,id=qtest-bn0,fd=%d "
> +                 "-device e1000,netdev=qtest-bn0,id=qtest-e0 "
> +                 "-chardev socket,id=mirror0,path=%s,server,nowait "
> +                 "-object filter-mirror,id=qtest-f0,netdev=qtest-bn0,queue=tx,outdev=mirror0 "
> +                 , send_sock[1], SOCK_PATH);

Rethink about the hard coded "/tmp". This looks not good, we'd better
switch to use mkdtemp() instead. There're few examples in tests/ for you
reference.

Other looks good.

> +    qtest_start(cmdline);
> +    g_free(cmdline);
> +
> +    recv_sock = unix_connect(SOCK_PATH, NULL);
> +    g_assert_cmpint(recv_sock, !=, -1);
> +
> +    struct iovec iov[] = {
> +        {
> +            .iov_base = &size,
> +            .iov_len = sizeof(size),
> +        }, {
> +            .iov_base = send_buf,
> +            .iov_len = sizeof(send_buf),
> +        },
> +    };
> +    ret = iov_send(send_sock[0], iov, 2, 0, sizeof(size) + sizeof(send_buf));
> +    g_assert_cmpint(ret, ==, sizeof(send_buf) + sizeof(size));
> +    close(send_sock[0]);
> +
> +    ret = qemu_recv(recv_sock, &len, sizeof(len), 0);
> +    g_assert_cmpint(ret, ==, sizeof(len));
> +    len = ntohl(len);
> +
> +    g_assert_cmpint(len, ==, sizeof(send_buf));
> +    recv_buf = g_malloc(len);
> +    ret = qemu_recv(recv_sock, recv_buf, len, 0);
> +    g_assert_cmpstr(recv_buf, ==, send_buf);
> +
> +    g_free(recv_buf);
> +    close(recv_sock);
> +    unlink(SOCK_PATH);
> +
> +#endif
> +}
> +
> +int main(int argc, char **argv)
> +{
> +    int ret;
> +
> +    g_test_init(&argc, &argv, NULL);
> +
> +    qtest_add_func("/netfilter/mirror", test_mirror);
> +    ret = g_test_run();
> +    qtest_end();
> +
> +    return ret;
> +}
Zhang Chen Feb. 24, 2016, 6:22 a.m. UTC | #2
On 02/24/2016 11:24 AM, Jason Wang wrote:
>
> On 02/23/2016 08:00 PM, Zhang Chen wrote:
>> In this unit test we will test the mirror function.
>>
>> start qemu with:
>>       -netdev socket,id=qtest-bn0,fd=sockfd
>>       -device e1000,netdev=qtest-bn0,id=qtest-e0
>>       -chardev socket,id=mirror0,path=/tmp/filter-mirror-test.sock,server,nowait
>>       -object filter-mirror,id=qtest-f0,netdev=qtest-bn0,queue=tx,outdev=mirror0
>>
>> We inject packet to netdev socket id = qtest-bn0,
>> filter-mirror will copy and mirror the packet to mirror0.
>> we read packet from mirror0 and then compare to what we inject.
>>
>> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
>> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
>> ---
>>   tests/.gitignore           |  1 +
>>   tests/Makefile             |  2 ++
>>   tests/test-filter-mirror.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++
>>   3 files changed, 90 insertions(+)
>>   create mode 100644 tests/test-filter-mirror.c
>>
>> diff --git a/tests/.gitignore b/tests/.gitignore
>> index 787c95c..10df017 100644
>> --- a/tests/.gitignore
>> +++ b/tests/.gitignore
>> @@ -63,5 +63,6 @@ test-write-threshold
>>   test-x86-cpuid
>>   test-xbzrle
>>   test-netfilter
>> +test-filter-mirror
>>   *-test
>>   qapi-schema/*.test.*
>> diff --git a/tests/Makefile b/tests/Makefile
>> index 650e654..e56c514 100644
>> --- a/tests/Makefile
>> +++ b/tests/Makefile
>> @@ -212,6 +212,7 @@ ifeq ($(CONFIG_VHOST_NET_TEST_i386),)
>>   check-qtest-x86_64-$(CONFIG_VHOST_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
>>   endif
>>   check-qtest-i386-y += tests/test-netfilter$(EXESUF)
>> +check-qtest-i386-y += tests/test-filter-mirror$(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))
>> @@ -563,6 +564,7 @@ tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_hel
>>   tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o $(test-util-obj-y)
>>   tests/test-write-threshold$(EXESUF): tests/test-write-threshold.o $(test-block-obj-y)
>>   tests/test-netfilter$(EXESUF): tests/test-netfilter.o $(qtest-obj-y)
>> +tests/test-filter-mirror$(EXESUF): tests/test-filter-mirror.o $(qtest-obj-y)
>>   tests/ivshmem-test$(EXESUF): tests/ivshmem-test.o contrib/ivshmem-server/ivshmem-server.o $(libqos-pc-obj-y)
>>   tests/vhost-user-bridge$(EXESUF): tests/vhost-user-bridge.o
>>   
>> diff --git a/tests/test-filter-mirror.c b/tests/test-filter-mirror.c
>> new file mode 100644
>> index 0000000..23dd7c0
>> --- /dev/null
>> +++ b/tests/test-filter-mirror.c
>> @@ -0,0 +1,87 @@
>> +/*
>> + * QTest testcase for filter-mirror
>> + *
>> + * Copyright (c) 2016 FUJITSU LIMITED
>> + * Author: Zhang Chen <zhangchen.fnst@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"
>> +#include "qemu/iov.h"
>> +#include "qemu/sockets.h"
>> +#include "qemu/error-report.h"
>> +#include "qemu/main-loop.h"
>> +
>> +#define SOCK_PATH "/tmp/filter-mirror-test.sock"
>> +
>> +static void test_mirror(void)
>> +{
>> +#ifndef _WIN32
>> +/* socketpair(PF_UNIX) which does not exist on windows */
>> +
>> +    int send_sock[2], recv_sock;
>> +    char *cmdline;
>> +    uint32_t ret = 0, len = 0;
>> +    char send_buf[] = "Hello! filter-mirror~";
>> +    char *recv_buf;
>> +    uint32_t size = sizeof(send_buf);
>> +    size = htonl(size);
>> +
>> +    ret = socketpair(PF_UNIX, SOCK_STREAM, 0, send_sock);
>> +    g_assert_cmpint(ret, !=, -1);
>> +
>> +    cmdline = g_strdup_printf("-netdev socket,id=qtest-bn0,fd=%d "
>> +                 "-device e1000,netdev=qtest-bn0,id=qtest-e0 "
>> +                 "-chardev socket,id=mirror0,path=%s,server,nowait "
>> +                 "-object filter-mirror,id=qtest-f0,netdev=qtest-bn0,queue=tx,outdev=mirror0 "
>> +                 , send_sock[1], SOCK_PATH);
> Rethink about the hard coded "/tmp". This looks not good, we'd better
> switch to use mkdtemp() instead. There're few examples in tests/ for you
> reference.
>
> Other looks good.

OK, I will fix in in next version.
Thanks
zhangchen

>> +    qtest_start(cmdline);
>> +    g_free(cmdline);
>> +
>> +    recv_sock = unix_connect(SOCK_PATH, NULL);
>> +    g_assert_cmpint(recv_sock, !=, -1);
>> +
>> +    struct iovec iov[] = {
>> +        {
>> +            .iov_base = &size,
>> +            .iov_len = sizeof(size),
>> +        }, {
>> +            .iov_base = send_buf,
>> +            .iov_len = sizeof(send_buf),
>> +        },
>> +    };
>> +    ret = iov_send(send_sock[0], iov, 2, 0, sizeof(size) + sizeof(send_buf));
>> +    g_assert_cmpint(ret, ==, sizeof(send_buf) + sizeof(size));
>> +    close(send_sock[0]);
>> +
>> +    ret = qemu_recv(recv_sock, &len, sizeof(len), 0);
>> +    g_assert_cmpint(ret, ==, sizeof(len));
>> +    len = ntohl(len);
>> +
>> +    g_assert_cmpint(len, ==, sizeof(send_buf));
>> +    recv_buf = g_malloc(len);
>> +    ret = qemu_recv(recv_sock, recv_buf, len, 0);
>> +    g_assert_cmpstr(recv_buf, ==, send_buf);
>> +
>> +    g_free(recv_buf);
>> +    close(recv_sock);
>> +    unlink(SOCK_PATH);
>> +
>> +#endif
>> +}
>> +
>> +int main(int argc, char **argv)
>> +{
>> +    int ret;
>> +
>> +    g_test_init(&argc, &argv, NULL);
>> +
>> +    qtest_add_func("/netfilter/mirror", test_mirror);
>> +    ret = g_test_run();
>> +    qtest_end();
>> +
>> +    return ret;
>> +}
>
>
> .
>
diff mbox

Patch

diff --git a/tests/.gitignore b/tests/.gitignore
index 787c95c..10df017 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -63,5 +63,6 @@  test-write-threshold
 test-x86-cpuid
 test-xbzrle
 test-netfilter
+test-filter-mirror
 *-test
 qapi-schema/*.test.*
diff --git a/tests/Makefile b/tests/Makefile
index 650e654..e56c514 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -212,6 +212,7 @@  ifeq ($(CONFIG_VHOST_NET_TEST_i386),)
 check-qtest-x86_64-$(CONFIG_VHOST_NET_TEST_x86_64) += tests/vhost-user-test$(EXESUF)
 endif
 check-qtest-i386-y += tests/test-netfilter$(EXESUF)
+check-qtest-i386-y += tests/test-filter-mirror$(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))
@@ -563,6 +564,7 @@  tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_hel
 tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o $(test-util-obj-y)
 tests/test-write-threshold$(EXESUF): tests/test-write-threshold.o $(test-block-obj-y)
 tests/test-netfilter$(EXESUF): tests/test-netfilter.o $(qtest-obj-y)
+tests/test-filter-mirror$(EXESUF): tests/test-filter-mirror.o $(qtest-obj-y)
 tests/ivshmem-test$(EXESUF): tests/ivshmem-test.o contrib/ivshmem-server/ivshmem-server.o $(libqos-pc-obj-y)
 tests/vhost-user-bridge$(EXESUF): tests/vhost-user-bridge.o
 
diff --git a/tests/test-filter-mirror.c b/tests/test-filter-mirror.c
new file mode 100644
index 0000000..23dd7c0
--- /dev/null
+++ b/tests/test-filter-mirror.c
@@ -0,0 +1,87 @@ 
+/*
+ * QTest testcase for filter-mirror
+ *
+ * Copyright (c) 2016 FUJITSU LIMITED
+ * Author: Zhang Chen <zhangchen.fnst@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"
+#include "qemu/iov.h"
+#include "qemu/sockets.h"
+#include "qemu/error-report.h"
+#include "qemu/main-loop.h"
+
+#define SOCK_PATH "/tmp/filter-mirror-test.sock"
+
+static void test_mirror(void)
+{
+#ifndef _WIN32
+/* socketpair(PF_UNIX) which does not exist on windows */
+
+    int send_sock[2], recv_sock;
+    char *cmdline;
+    uint32_t ret = 0, len = 0;
+    char send_buf[] = "Hello! filter-mirror~";
+    char *recv_buf;
+    uint32_t size = sizeof(send_buf);
+    size = htonl(size);
+
+    ret = socketpair(PF_UNIX, SOCK_STREAM, 0, send_sock);
+    g_assert_cmpint(ret, !=, -1);
+
+    cmdline = g_strdup_printf("-netdev socket,id=qtest-bn0,fd=%d "
+                 "-device e1000,netdev=qtest-bn0,id=qtest-e0 "
+                 "-chardev socket,id=mirror0,path=%s,server,nowait "
+                 "-object filter-mirror,id=qtest-f0,netdev=qtest-bn0,queue=tx,outdev=mirror0 "
+                 , send_sock[1], SOCK_PATH);
+    qtest_start(cmdline);
+    g_free(cmdline);
+
+    recv_sock = unix_connect(SOCK_PATH, NULL);
+    g_assert_cmpint(recv_sock, !=, -1);
+
+    struct iovec iov[] = {
+        {
+            .iov_base = &size,
+            .iov_len = sizeof(size),
+        }, {
+            .iov_base = send_buf,
+            .iov_len = sizeof(send_buf),
+        },
+    };
+    ret = iov_send(send_sock[0], iov, 2, 0, sizeof(size) + sizeof(send_buf));
+    g_assert_cmpint(ret, ==, sizeof(send_buf) + sizeof(size));
+    close(send_sock[0]);
+
+    ret = qemu_recv(recv_sock, &len, sizeof(len), 0);
+    g_assert_cmpint(ret, ==, sizeof(len));
+    len = ntohl(len);
+
+    g_assert_cmpint(len, ==, sizeof(send_buf));
+    recv_buf = g_malloc(len);
+    ret = qemu_recv(recv_sock, recv_buf, len, 0);
+    g_assert_cmpstr(recv_buf, ==, send_buf);
+
+    g_free(recv_buf);
+    close(recv_sock);
+    unlink(SOCK_PATH);
+
+#endif
+}
+
+int main(int argc, char **argv)
+{
+    int ret;
+
+    g_test_init(&argc, &argv, NULL);
+
+    qtest_add_func("/netfilter/mirror", test_mirror);
+    ret = g_test_run();
+    qtest_end();
+
+    return ret;
+}