diff mbox series

[RFC,12/12] test/qtest: Add ubpf basic test case

Message ID 20220617073630.535914-13-chen.zhang@intel.com (mailing list archive)
State New, archived
Headers show
Series Introduce QEMU userspace ebpf support | expand

Commit Message

Zhang Chen June 17, 2022, 7:36 a.m. UTC
TODO: This test case does not work. Need add ubpf.h header in qtest
compile "-I ../ubpf/vm -I ../ubpf/vm/inc".
I'm not sure if we need it in qtest. Because normal tests/qtest
not including external module test case like fdt. Or we just
need a qtest case for filter-ubpf module.
This test will load pre-compiled ebpf binary and run it in QEMU.

Signed-off-by: Zhang Chen <chen.zhang@intel.com>
---
 tests/qtest/demo_ubpf.o   | Bin 0 -> 544 bytes
 tests/qtest/integer_5.mem | Bin 0 -> 4 bytes
 tests/qtest/meson.build   |   3 +-
 tests/qtest/ubpf-test.c   |  64 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 66 insertions(+), 1 deletion(-)
 create mode 100644 tests/qtest/demo_ubpf.o
 create mode 100644 tests/qtest/integer_5.mem
 create mode 100644 tests/qtest/ubpf-test.c

Comments

Thomas Huth June 17, 2022, 9:34 a.m. UTC | #1
On 17/06/2022 09.36, Zhang Chen wrote:
> TODO: This test case does not work. Need add ubpf.h header in qtest
> compile "-I ../ubpf/vm -I ../ubpf/vm/inc".
> I'm not sure if we need it in qtest. Because normal tests/qtest
> not including external module test case like fdt. Or we just
> need a qtest case for filter-ubpf module.
> This test will load pre-compiled ebpf binary and run it in QEMU.
> 
> Signed-off-by: Zhang Chen <chen.zhang@intel.com>
> ---
[...]
> diff --git a/tests/qtest/ubpf-test.c b/tests/qtest/ubpf-test.c
> new file mode 100644
> index 0000000000..6e70a99320
> --- /dev/null
> +++ b/tests/qtest/ubpf-test.c
> @@ -0,0 +1,64 @@
> +/*
> + * QEMU Userspace eBPF test case
> + *
> + * Copyright(C) 2022 Intel Corporation.
> + *
> + * Author:
> + *  Zhang Chen <chen.zhang@intel.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 "qemu/osdep.h"
> +#include "libqtest.h"
> +#include "ebpf/ubpf.h"
> +
> +/*
> + * Demo userspace ebpf program
> + * The test binary use clang to build this source code:
> + * demo_ubpf.c
> + *
> + * #include <stdint.h>
> + *
> + * static uint32_t double_it(uint32_t a)
> + * {
> + *      return (a * 2);
> + * }
> + *
> + * uint32_t bpf_prog(int32_t *arg) {
> + *       uint32_t result = 0;
> + *       result = double_it(*arg);
> + *
> + *       return result;
> + * }
> + *
> + * Build the userspace ebpf program binary file:
> + * clang -O2 -target bpf -c demo_ubpf.c -o demo_ubpf.o
> + *
> + * The external terget source:
> + * printf "%b" '\x05\x00\x00\x00' > integer_5.mem
> + *
> + */
> +
> +int main(int argc, char **argc)
> +{
> +    UbpfState u_ebpf;
> +    char program_path[] = "demo_ubpf.o";
> +    /* uBPF can read target from internal source or external source*/
> +    char target_path[] = "integer_5.mem";
> +
> +    qemu_ubpf_init_jit(&u_ebpf, true);
> +
> +    g_assert_cmpuint(qemu_ubpf_prepare(&u_ebpf, program_path), ==, 0);
> +
> +    g_assert_true(qemu_ubpf_read_target(&u_ebpf, target_path));
> +
> +    g_assert_cmpuint(qemu_run_ubpf_once(&u_ebpf, u_ebpf.target,
> +		     u_ebpf.target_len), ==, 10);
> +
> +    ubpf_destroy(u_ebpf.vm);
> +
> +    return 0;
> +}

Apart from the #include "libqtest.h" there is nothing related to qtest in 
here ... should this maybe rather go into test/unit/ instead?

  Thomas
Zhang Chen June 20, 2022, 9:31 a.m. UTC | #2
> -----Original Message-----
> From: Thomas Huth <thuth@redhat.com>
> Sent: Friday, June 17, 2022 5:34 PM
> To: Zhang, Chen <chen.zhang@intel.com>; Jason Wang
> <jasowang@redhat.com>; qemu-dev <qemu-devel@nongnu.org>; Paolo
> Bonzini <pbonzini@redhat.com>; Daniel P. Berrangé
> <berrange@redhat.com>; Eduardo Habkost <eduardo@habkost.net>; Eric
> Blake <eblake@redhat.com>; Markus Armbruster <armbru@redhat.com>
> Cc: Peter Maydell <peter.maydell@linaro.org>; Laurent Vivier
> <lvivier@redhat.com>; Yuri Benditovich <yuri.benditovich@daynix.com>;
> Andrew Melnychenko <andrew@daynix.com>
> Subject: Re: [RFC PATCH 12/12] test/qtest: Add ubpf basic test case
> 
> On 17/06/2022 09.36, Zhang Chen wrote:
> > TODO: This test case does not work. Need add ubpf.h header in qtest
> > compile "-I ../ubpf/vm -I ../ubpf/vm/inc".
> > I'm not sure if we need it in qtest. Because normal tests/qtest not
> > including external module test case like fdt. Or we just need a qtest
> > case for filter-ubpf module.
> > This test will load pre-compiled ebpf binary and run it in QEMU.
> >
> > Signed-off-by: Zhang Chen <chen.zhang@intel.com>
> > ---
> [...]
> > diff --git a/tests/qtest/ubpf-test.c b/tests/qtest/ubpf-test.c new
> > file mode 100644 index 0000000000..6e70a99320
> > --- /dev/null
> > +++ b/tests/qtest/ubpf-test.c
> > @@ -0,0 +1,64 @@
> > +/*
> > + * QEMU Userspace eBPF test case
> > + *
> > + * Copyright(C) 2022 Intel Corporation.
> > + *
> > + * Author:
> > + *  Zhang Chen <chen.zhang@intel.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 "qemu/osdep.h"
> > +#include "libqtest.h"
> > +#include "ebpf/ubpf.h"
> > +
> > +/*
> > + * Demo userspace ebpf program
> > + * The test binary use clang to build this source code:
> > + * demo_ubpf.c
> > + *
> > + * #include <stdint.h>
> > + *
> > + * static uint32_t double_it(uint32_t a)
> > + * {
> > + *      return (a * 2);
> > + * }
> > + *
> > + * uint32_t bpf_prog(int32_t *arg) {
> > + *       uint32_t result = 0;
> > + *       result = double_it(*arg);
> > + *
> > + *       return result;
> > + * }
> > + *
> > + * Build the userspace ebpf program binary file:
> > + * clang -O2 -target bpf -c demo_ubpf.c -o demo_ubpf.o
> > + *
> > + * The external terget source:
> > + * printf "%b" '\x05\x00\x00\x00' > integer_5.mem
> > + *
> > + */
> > +
> > +int main(int argc, char **argc)
> > +{
> > +    UbpfState u_ebpf;
> > +    char program_path[] = "demo_ubpf.o";
> > +    /* uBPF can read target from internal source or external source*/
> > +    char target_path[] = "integer_5.mem";
> > +
> > +    qemu_ubpf_init_jit(&u_ebpf, true);
> > +
> > +    g_assert_cmpuint(qemu_ubpf_prepare(&u_ebpf, program_path), ==,
> > + 0);
> > +
> > +    g_assert_true(qemu_ubpf_read_target(&u_ebpf, target_path));
> > +
> > +    g_assert_cmpuint(qemu_run_ubpf_once(&u_ebpf, u_ebpf.target,
> > +		     u_ebpf.target_len), ==, 10);
> > +
> > +    ubpf_destroy(u_ebpf.vm);
> > +
> > +    return 0;
> > +}
> 
> Apart from the #include "libqtest.h" there is nothing related to qtest in
> here ... should this maybe rather go into test/unit/ instead?

Rethink about it, I think you are right.
The only issue is can we involve submodule's header file in tests/unit?
I can't find meson/fdt/SLIRP test cases in the tests.

Thanks
Chen

> 
>   Thomas
Thomas Huth June 20, 2022, 9:51 a.m. UTC | #3
On 20/06/2022 11.31, Zhang, Chen wrote:
> 
>> -----Original Message-----
>> From: Thomas Huth <thuth@redhat.com>
>> Sent: Friday, June 17, 2022 5:34 PM
>> To: Zhang, Chen <chen.zhang@intel.com>; Jason Wang
>> <jasowang@redhat.com>; qemu-dev <qemu-devel@nongnu.org>; Paolo
>> Bonzini <pbonzini@redhat.com>; Daniel P. Berrangé
>> <berrange@redhat.com>; Eduardo Habkost <eduardo@habkost.net>; Eric
>> Blake <eblake@redhat.com>; Markus Armbruster <armbru@redhat.com>
>> Cc: Peter Maydell <peter.maydell@linaro.org>; Laurent Vivier
>> <lvivier@redhat.com>; Yuri Benditovich <yuri.benditovich@daynix.com>;
>> Andrew Melnychenko <andrew@daynix.com>
>> Subject: Re: [RFC PATCH 12/12] test/qtest: Add ubpf basic test case
>>
>> On 17/06/2022 09.36, Zhang Chen wrote:
>>> TODO: This test case does not work. Need add ubpf.h header in qtest
>>> compile "-I ../ubpf/vm -I ../ubpf/vm/inc".
>>> I'm not sure if we need it in qtest. Because normal tests/qtest not
>>> including external module test case like fdt. Or we just need a qtest
>>> case for filter-ubpf module.
>>> This test will load pre-compiled ebpf binary and run it in QEMU.
>>>
>>> Signed-off-by: Zhang Chen <chen.zhang@intel.com>
>>> ---
[...]
>> Apart from the #include "libqtest.h" there is nothing related to qtest in
>> here ... should this maybe rather go into test/unit/ instead?
> 
> Rethink about it, I think you are right.
> The only issue is can we involve submodule's header file in tests/unit?
> I can't find meson/fdt/SLIRP test cases in the tests.

Well, the test should only be enabled in meson.build if the CONFIG_UBPF 
switch is also enabled, then you can be sure that the header files of ubpf 
are also available when it gets compiled.

  Thomas
diff mbox series

Patch

diff --git a/tests/qtest/demo_ubpf.o b/tests/qtest/demo_ubpf.o
new file mode 100644
index 0000000000000000000000000000000000000000..960a411c224348548db42d9ae2716ae3ef4ea249
GIT binary patch
literal 544
zcmb<-^>JfjWMqH=MuzVU2p&w7f#Csy$>0EHJ20>URVE5RB+`KtNZ(Wl7bhtPlwo1`
z_#a&XJ5WG~fe9`w0b}Wvq*jzLBo(B^7Zl~EGw9{yl;y@Jrlb@VXQnfh0>yPpQj1IU
zk{R@hONvSolYn$(E{LWM&;lC6jK!!0P%$esIrOjt@j;jkO`QXj5BDdO&w-{66uitn
o|MP)V1G3ZtWDbzc0_CIIZv+%agepQ)1eEE4qz|MHW<Shb0E~Jd)c^nh

literal 0
HcmV?d00001

diff --git a/tests/qtest/integer_5.mem b/tests/qtest/integer_5.mem
new file mode 100644
index 0000000000000000000000000000000000000000..a786e127004dd9e94e88fda7742d248237ad8885
GIT binary patch
literal 4
LcmZQ&U|;|M02lxU

literal 0
HcmV?d00001

diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 31287a9173..9cc629e22b 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -94,7 +94,8 @@  qtests_i386 = \
    'migration-test',
    'test-x86-cpuid-compat',
    'numa-test',
-   'test-filter-redirector'
+   'test-filter-redirector',
+   'ubpf-test'
   ]
 
 if dbus_display
diff --git a/tests/qtest/ubpf-test.c b/tests/qtest/ubpf-test.c
new file mode 100644
index 0000000000..6e70a99320
--- /dev/null
+++ b/tests/qtest/ubpf-test.c
@@ -0,0 +1,64 @@ 
+/*
+ * QEMU Userspace eBPF test case
+ *
+ * Copyright(C) 2022 Intel Corporation.
+ *
+ * Author:
+ *  Zhang Chen <chen.zhang@intel.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 "qemu/osdep.h"
+#include "libqtest.h"
+#include "ebpf/ubpf.h"
+
+/*
+ * Demo userspace ebpf program
+ * The test binary use clang to build this source code:
+ * demo_ubpf.c
+ *
+ * #include <stdint.h>
+ *
+ * static uint32_t double_it(uint32_t a)
+ * {
+ *      return (a * 2);
+ * }
+ *
+ * uint32_t bpf_prog(int32_t *arg) {
+ *       uint32_t result = 0;
+ *       result = double_it(*arg);
+ *
+ *       return result;
+ * }
+ *
+ * Build the userspace ebpf program binary file:
+ * clang -O2 -target bpf -c demo_ubpf.c -o demo_ubpf.o
+ *
+ * The external terget source:
+ * printf "%b" '\x05\x00\x00\x00' > integer_5.mem
+ *
+ */
+
+int main(int argc, char **argc)
+{
+    UbpfState u_ebpf;
+    char program_path[] = "demo_ubpf.o";
+    /* uBPF can read target from internal source or external source*/
+    char target_path[] = "integer_5.mem";
+
+    qemu_ubpf_init_jit(&u_ebpf, true);
+
+    g_assert_cmpuint(qemu_ubpf_prepare(&u_ebpf, program_path), ==, 0);
+
+    g_assert_true(qemu_ubpf_read_target(&u_ebpf, target_path));
+
+    g_assert_cmpuint(qemu_run_ubpf_once(&u_ebpf, u_ebpf.target,
+		     u_ebpf.target_len), ==, 10);
+
+    ubpf_destroy(u_ebpf.vm);
+
+    return 0;
+}