> -----Original Message-----
> From: [email protected] [mailto:lng-odp-
> [email protected]] On Behalf Of ext Mike Holmes
> Sent: Friday, August 29, 2014 5:41 PM
> To: [email protected]
> Subject: [lng-odp] [PATCH v2] test/unit: add odp_buffer_test
>
> Signed-off-by: Mike Holmes <[email protected]>
> Signed-off-by: Anders Roxell <[email protected]>
> ---
>
> v2:
> Add dependencies
> Add cross compile
> Add comments on test cases
>
> .gitignore | 1 +
> DEPENDENCIES | 19 +++-
> configure.ac | 20 ++++
> test/Makefile.am | 2 +-
> test/api_test/Makefile.am | 1 +
> test/unit/Makefile.am | 11 +++
> test/unit/odp_buffer_test.c | 222
> ++++++++++++++++++++++++++++++++++++++++++++
> 7 files changed, 274 insertions(+), 2 deletions(-)
> create mode 100644 test/unit/Makefile.am
> create mode 100644 test/unit/odp_buffer_test.c
>
> diff --git a/.gitignore b/.gitignore
> index 6a97f17..1000401 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -42,4 +42,5 @@ odp_pktio
> odp_timer_test
> odp_generator
> odp_l2fwd
> +odp_buffer
> doxygen-doc
> diff --git a/DEPENDENCIES b/DEPENDENCIES
> index 9597511..f54724d 100644
> --- a/DEPENDENCIES
> +++ b/DEPENDENCIES
> @@ -75,4 +75,21 @@ Prerequisites for building the OpenDataPlane (ODP) API
> # Or build 64 bit version of ODP
> $ ./configure --host=aarch64-linux-gnu \
> --with-openssl-path=/home/user/src/install-openssl-aarch64
> - $ make
> \ No newline at end of file
> + $ make
> +
> +4. packages needed to build API tests
> +
> +4.1 Native compile
> +
> + # Debian/Ubuntu
> + $ apt-get install libcunit1-dev
> +
> + On CentOS/RedHat/Fedora systems:
> + $ su -c 'yum update CUnit'
> +
> +4.2 Cross compile
> +
> + $ git svn clone http://svn.code.sf.net/p/cunit/code/trunk cunit-code
> + $ cd cunit-code
> + $ ./bootstrap
> + $ ./configure --host=arm-linux-gnueabihf --
> prefix=/home/user/src/install-cunit
> diff --git a/configure.ac b/configure.ac
> index 5574f82..d63f9ef 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -73,6 +73,25 @@ AC_ARG_ENABLE([netmap],
> AM_CONDITIONAL([ODP_NETMAP_ENABLED], [test x$netmap_support = xyes ])
>
>
> ##########################################################################
> +# Enable/disable Unit tests
> +#########################################################################
> #
> +AC_ARG_ENABLE([cunit],
> + [ --enable-cunit Enable/Disable cunit. See cunit-path],
> + [if test x$enableval = xyes; then
> + unit_support=yes
> + fi])
> +
> +AC_ARG_WITH([cunit-path],
> +AC_HELP_STRING([--with-cunit-path=DIR Path to Cunit libs and headers],
> + [(automaticly implies --enable-cunit).]),
> +[CUNIT_PATH=$withval unit_support=yes
> +],[ AC_MSG_WARN([Cunit not found - continuing without Cunit support])
> +])
> +
> +AC_SUBST(CUNIT_PATH)
> +AM_CONDITIONAL([ODP_UNIT_ENABLED], [test x$unit_support = xyes ])
> +
> +#########################################################################
> #
> # Enable/disable ODP_DEBUG_PRINT
>
> ##########################################################################
> ODP_DEBUG=1
> @@ -152,6 +171,7 @@ AC_CONFIG_FILES([Makefile
> example/timer/Makefile
> test/Makefile
> test/api_test/Makefile
> + test/unit/Makefile
> pkgconfig/libodp.pc])
>
> AC_SEARCH_LIBS([timer_create],[rt posix4])
> diff --git a/test/Makefile.am b/test/Makefile.am
> index 9bd7db1..dda7d5e 100644
> --- a/test/Makefile.am
> +++ b/test/Makefile.am
> @@ -1 +1 @@
> -SUBDIRS = api_test
> +SUBDIRS = api_test unit
> diff --git a/test/api_test/Makefile.am b/test/api_test/Makefile.am
> index 5104454..d76bc26 100644
> --- a/test/api_test/Makefile.am
> +++ b/test/api_test/Makefile.am
> @@ -1,6 +1,7 @@
> include $(top_srcdir)/test/Makefile.inc
>
> bin_PROGRAMS = odp_atomic odp_shm odp_ring odp_timer_ping
> +
> odp_atomic_LDFLAGS = $(AM_LDFLAGS) -static
> odp_shm_LDFLAGS = $(AM_LDFLAGS) -static
> odp_ring_LDFLAGS = $(AM_LDFLAGS) -static
> diff --git a/test/unit/Makefile.am b/test/unit/Makefile.am
> new file mode 100644
> index 0000000..9554ed9
> --- /dev/null
> +++ b/test/unit/Makefile.am
> @@ -0,0 +1,11 @@
> +include $(top_srcdir)/test/Makefile.inc
> +
> +AM_CFLAGS += -I$(CUNIT_PATH)/include
> +AM_LDFLAGS += -L$(CUNIT_PATH)/lib
> +
> +if ODP_UNIT_ENABLED
> +bin_PROGRAMS = odp_buffer
> +odp_buffer_LDFLAGS = $(AM_LDFLAGS) -static -lcunit
> +endif
> +
> +dist_odp_buffer_SOURCES = odp_buffer_test.c
> diff --git a/test/unit/odp_buffer_test.c b/test/unit/odp_buffer_test.c
> new file mode 100644
> index 0000000..5bc990e
> --- /dev/null
> +++ b/test/unit/odp_buffer_test.c
> @@ -0,0 +1,222 @@
> +/* Copyright (c) 2014, Linaro Limited
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier: BSD-3-Clause
> + */
> +
> +#include "odp.h"
> +#include "CUnit/Basic.h"
> +
> +#define DEFAULT_MSG_POOL_SIZE (4*1024*1024)
> +#define DEFAULT_MSG_SIZE (8)
> +
> +static void test_odp_buffer_addr(void)
> +{
> + void *startaddress;
> + odp_buffer_pool_t msg_pool;
> + odp_buffer_t mybuffer;
> + void *pool_base;
> + /* correct address returned */
> + pool_base = odp_shm_reserve("msg_pool1",
> + DEFAULT_MSG_POOL_SIZE,
> + ODP_CACHE_LINE_SIZE);
> + msg_pool = odp_buffer_pool_create("msg_pool1",
> + pool_base,
> + DEFAULT_MSG_POOL_SIZE,
> + DEFAULT_MSG_SIZE,
> + ODP_CACHE_LINE_SIZE,
> + ODP_BUFFER_TYPE_RAW);
> + mybuffer = odp_buffer_alloc(msg_pool);
> + startaddress = odp_buffer_addr(mybuffer);
> + odp_buffer_free(mybuffer);
> + CU_ASSERT_TRUE(startaddress != NULL);
No error checks for invalid handles ... Test passes also if invalid handles are
accepted and odp_buffer_addr() returns garbage.
> +}
> +
> +static void test_odp_buffer_size(void)
> +{
> + size_t size;
> + odp_buffer_pool_t msg_pool;
> + odp_buffer_t mybuffer;
> + void *pool_base;
> + /* correct size returned */
> + pool_base = odp_shm_reserve("msg_pool2",
> + DEFAULT_MSG_POOL_SIZE,
> + ODP_CACHE_LINE_SIZE);
> + msg_pool = odp_buffer_pool_create("msg_pool2", pool_base,
> + DEFAULT_MSG_POOL_SIZE,
> + DEFAULT_MSG_SIZE,
> + ODP_CACHE_LINE_SIZE,
> + ODP_BUFFER_TYPE_RAW);
Are you sure you want to do a shm and pool allocation per test. An
implementation may run out of shm segments or pools (especially when more test
cases are added).
> + mybuffer = odp_buffer_alloc(msg_pool);
> + size = odp_buffer_size(mybuffer);
> + odp_buffer_free(mybuffer);
> + CU_ASSERT_TRUE(size == DEFAULT_MSG_SIZE);
> + msg_pool = odp_buffer_pool_create("msg_pool2_1", pool_base,
> + DEFAULT_MSG_POOL_SIZE,
> + -1,
> + ODP_CACHE_LINE_SIZE,
> + ODP_BUFFER_TYPE_RAW);
Same pool_base should not be used twice. So the failure may be also caused by
that.
> + CU_ASSERT_TRUE(msg_pool == ODP_BUFFER_POOL_INVALID);
> + mybuffer = odp_buffer_alloc(msg_pool);
> + size = odp_buffer_size(mybuffer);
> + odp_buffer_free(mybuffer);
> + CU_ASSERT_TRUE(size == ODP_BUFFER_INVALID);
odp_buffer_size() does not return ODP_BUFFER_INVALID.
> +}
> +
> +static void test_odp_buffer_type(int type_in)
> +{
> + int type;
> + odp_buffer_pool_t msg_pool;
> + odp_buffer_t mybuffer;
> + void *pool_base;
> + char pool_name[32];
> + /* valid types */
> + sprintf(pool_name, "mag_pool_%d", type_in);
> + pool_base = odp_shm_reserve(pool_name,
> + DEFAULT_MSG_POOL_SIZE,
> + ODP_CACHE_LINE_SIZE);
> + msg_pool = odp_buffer_pool_create(pool_name, pool_base,
> + DEFAULT_MSG_POOL_SIZE,
> + DEFAULT_MSG_SIZE,
> + ODP_CACHE_LINE_SIZE, type_in);
> + mybuffer = odp_buffer_alloc(msg_pool);
> + type = odp_buffer_type(mybuffer);
> + odp_buffer_free(mybuffer);
> + CU_ASSERT_TRUE(type == type_in);
> +}
> +
> +static void test_odp_buffer_type_valid(void)
> +{
> + test_odp_buffer_type(ODP_BUFFER_TYPE_ANY);
> + test_odp_buffer_type(ODP_BUFFER_TYPE_RAW);
> + test_odp_buffer_type(ODP_BUFFER_TYPE_PACKET);
> + test_odp_buffer_type(ODP_BUFFER_TYPE_TIMEOUT);
> +}
> +
> +static void test_odp_buffer_type_invalid(void)
> +{
> + int type;
> + int type_in = ODP_BUFFER_TYPE_INVALID;
> + odp_buffer_pool_t msg_pool;
> + odp_buffer_t mybuffer;
> + void *pool_base;
> + /* invalid type */
> + pool_base = odp_shm_reserve("msg_pool4",
> + DEFAULT_MSG_POOL_SIZE,
> + ODP_CACHE_LINE_SIZE);
> + msg_pool = odp_buffer_pool_create("msg_pool4", pool_base,
> + DEFAULT_MSG_POOL_SIZE,
> + DEFAULT_MSG_SIZE,
> + ODP_CACHE_LINE_SIZE, type_in);
> + /* msg_pool should fail */
> + CU_ASSERT_TRUE(msg_pool == ODP_BUFFER_POOL_INVALID);
> + /* mybuffer should fail */
> + mybuffer = odp_buffer_alloc(msg_pool);
> + CU_ASSERT_TRUE(mybuffer == ODP_BUFFER_INVALID);
> + /* type should fail */
> + type = odp_buffer_type(mybuffer);
> + odp_buffer_free(mybuffer);
> + CU_ASSERT_TRUE(type == type_in);
> +}
> +
> +static void test_odp_is_scatter(void)
> +{
> + int is_scatter;
> + odp_buffer_pool_t msg_pool;
> + odp_buffer_t mybuffer;
> + void *pool_base;
> + /* scatter is boolean */
> + pool_base = odp_shm_reserve("msg_pool5",
> + DEFAULT_MSG_POOL_SIZE,
> + ODP_CACHE_LINE_SIZE);
> + msg_pool = odp_buffer_pool_create("msg_pool5", pool_base,
> + DEFAULT_MSG_POOL_SIZE,
> + DEFAULT_MSG_SIZE,
> + ODP_CACHE_LINE_SIZE,
> + ODP_BUFFER_TYPE_RAW);
> + mybuffer = odp_buffer_alloc(msg_pool);
> + is_scatter = odp_buffer_size(mybuffer);
This is now odp_packet_is_segmented(), not odp_buffer_size()...
> + odp_buffer_free(mybuffer);
> + CU_ASSERT_TRUE((is_scatter < 0) || (is_scatter > 1));
> +}
> +
> +static void test_odp_is_valid(void)
> +{
> + int is_valid;
> + odp_buffer_pool_t msg_pool;
> + odp_buffer_t mybuffer;
> + void *pool_base;
> + /* valid is boolean */
> + pool_base = odp_shm_reserve("msg_pool6",
> + DEFAULT_MSG_POOL_SIZE,
> + ODP_CACHE_LINE_SIZE);
> + msg_pool = odp_buffer_pool_create("msg_pool6", pool_base,
> + DEFAULT_MSG_POOL_SIZE,
> + DEFAULT_MSG_SIZE,
> + ODP_CACHE_LINE_SIZE,
> + ODP_BUFFER_TYPE_RAW);
> + mybuffer = odp_buffer_alloc(msg_pool);
> + is_valid = odp_buffer_is_valid(mybuffer);
> + odp_buffer_free(mybuffer);
> + CU_ASSERT_FALSE((is_valid < 0) || (is_valid > 1));
It should be valid. So check only is_valid == 1 ?
> +}
> +
> +static void test_odp_buffer_print(void)
> +{
> + odp_buffer_pool_t msg_pool;
> + odp_buffer_t mybuffer;
> + void *pool_base;
> + pool_base = odp_shm_reserve("msg_pool8",
> + DEFAULT_MSG_POOL_SIZE,
> + ODP_CACHE_LINE_SIZE);
> + msg_pool = odp_buffer_pool_create("msg_pool8", pool_base,
> + DEFAULT_MSG_POOL_SIZE,
> + DEFAULT_MSG_SIZE,
> + ODP_CACHE_LINE_SIZE,
> + ODP_BUFFER_TYPE_RAW);
> + mybuffer = odp_buffer_alloc(msg_pool);
> + odp_buffer_print(mybuffer);
> + odp_buffer_free(mybuffer);
> + CU_PASS("test_odp_buffer_print");
> +}
> +
> +static int init_suite1(void)
> +{
> + odp_init_global();
odp_init_local() must be also called (per thread).
> + return 0;
> +}
> +
> +static int clean_suite1(void)
> +{
> + return 0;
> +}
> +
> +int main(void)
> +{
> + CU_pSuite pSuite = NULL;
> + /* initialize the CUnit test registry */
> + if (CUE_SUCCESS != CU_initialize_registry())
> + return CU_get_error();
> + /* add a suite to the registry */
> + pSuite = CU_add_suite("odp_buffer_pool", init_suite1, clean_suite1);
> + if (NULL == pSuite) {
> + CU_cleanup_registry();
> + return CU_get_error();
> + }
> + /* add the tests to the suite */
> + if ((NULL == CU_ADD_TEST(pSuite, test_odp_buffer_size)) ||
> + (NULL == CU_ADD_TEST(pSuite, test_odp_buffer_addr)) ||
> + (NULL == CU_ADD_TEST(pSuite, test_odp_buffer_type_valid)) ||
> + (NULL == CU_ADD_TEST(pSuite, test_odp_buffer_type_invalid)) ||
> + (NULL == CU_ADD_TEST(pSuite, test_odp_is_valid)) ||
> + (NULL == CU_ADD_TEST(pSuite, test_odp_is_scatter)) ||
> + (NULL == CU_ADD_TEST(pSuite, test_odp_buffer_print))) {
> + CU_cleanup_registry();
> + return CU_get_error();
> + }
> + /* Run all tests using the CUnit Basic interface */
> + CU_basic_set_mode(CU_BRM_VERBOSE);
> + CU_basic_run_tests();
This is single thread test. It's important to have a multi-threaded version
also (to catch race conditions, etc ...)
-Petri
> + CU_cleanup_registry();
> + return CU_get_error();
> +}
> --
> 1.9.1
>
>
> _______________________________________________
> lng-odp mailing list
> [email protected]
> http://lists.linaro.org/mailman/listinfo/lng-odp
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp