diff mbox

[v2] cunit: add shm test

Message ID 1416495295-47615-1-git-send-email-yan.songming@linaro.org
State New
Headers show

Commit Message

yan.songming Nov. 20, 2014, 2:54 p.m. UTC
Add odp_cunit_common.c for common cunit function and add the cunit
test for the api in odp_share_memory.h which include the new api implement
odp_shm_free.

Signed-off-by: Yan Songming <yan.songming@linaro.org>
---
v2 fix some problem which maxim and mike found.
---
 test/validation/Makefile.am        |   4 +-
 test/validation/odp_cunit_common.c |  37 ++++++++++++
 test/validation/odp_cunit_common.h |  41 +++++++++++++
 test/validation/odp_shm.c          | 121 +++++++++++++++++++++++++++++++++++++
 4 files changed, 202 insertions(+), 1 deletion(-)
 create mode 100644 test/validation/odp_cunit_common.c
 create mode 100644 test/validation/odp_cunit_common.h
 create mode 100644 test/validation/odp_shm.c

Comments

Maxim Uvarov Nov. 23, 2014, 12:50 p.m. UTC | #1
you also need to update .gitignore.

Maxim.

On 11/21/2014 11:42 PM, Mike Holmes wrote:
> It looks like this needs to be revised to match the rules as they have 
> evolved this week.
>
> On 20 November 2014 09:54, Yan Songming <yan.songming@linaro.org 
> <mailto:yan.songming@linaro.org>> wrote:
>
>     Add odp_cunit_common.c for common cunit function and add the cunit
>     test for the api in odp_share_memory.h which include the new api
>     implement
>     odp_shm_free.
>
>     Signed-off-by: Yan Songming <yan.songming@linaro.org
>     <mailto:yan.songming@linaro.org>>
>     ---
>     v2 fix some problem which maxim and mike found.
>     ---
>      test/validation/Makefile.am        |   4 +-
>      test/validation/odp_cunit_common.c |  37 ++++++++++++
>      test/validation/odp_cunit_common.h |  41 +++++++++++++
>
>
> This breaks the rule that test/validation contain only the main entry 
> point for the tests, if we like this file and think it can contain 
> multiple useful functions for unit testing I propose it lives in 
> test/validation/common
>
>      test/validation/odp_shm.c         | 121
>     +++++++++++++++++++++++++++++++++++++
>      4 files changed, 202 insertions(+), 1 deletion(-)
>      create mode 100644 test/validation/odp_cunit_common.c
>      create mode 100644 test/validation/odp_cunit_common.h
>      create mode 100644 test/validation/odp_shm.c
>
>     diff --git a/test/validation/Makefile.am b/test/validation/Makefile.am
>     index 2e1b991..5992f72 100644
>     --- a/test/validation/Makefile.am
>     +++ b/test/validation/Makefile.am
>     @@ -6,11 +6,12 @@ AM_LDFLAGS += -L$(CUNIT_PATH)/lib -static -lcunit
>      if ODP_CUNIT_ENABLED
>      TESTS = ${bin_PROGRAMS}
>      check_PROGRAMS = ${bin_PROGRAMS}
>     -bin_PROGRAMS = odp_init odp_queue odp_crypto
>     +bin_PROGRAMS = odp_init odp_queue odp_crypto odp_shm
>      odp_init_LDFLAGS = $(AM_LDFLAGS)
>      odp_queue_LDFLAGS = $(AM_LDFLAGS)
>      odp_crypto_CFLAGS = $(AM_CFLAGS) -I./crypto
>      odp_crypto_LDFLAGS = $(AM_LDFLAGS)
>     +odp_shm_LDFLAGS = $(AM_LDFLAGS)
>      endif
>
>      dist_odp_init_SOURCES = odp_init.c
>     @@ -18,3 +19,4 @@ dist_odp_queue_SOURCES = odp_queue.c
>      dist_odp_crypto_SOURCES = crypto/odp_crypto_test_async_inp.c \
>     crypto/odp_crypto_test_sync_inp.c \
>                               odp_crypto.c
>     +dist_odp_shm_SOURCES = odp_shm.c odp_cunit_common.c
>     diff --git a/test/validation/odp_cunit_common.c
>     b/test/validation/odp_cunit_common.c
>     new file mode 100644
>     index 0000000..885b981
>     --- /dev/null
>     +++ b/test/validation/odp_cunit_common.c
>     @@ -0,0 +1,37 @@
>     +/* Copyright (c) 2014, Linaro Limited
>     + * All rights reserved.
>     + *
>     + * SPDX-License-Identifier:     BSD-3-Clause
>     + */
>     +
>     +/**
>     + * @file
>     + *
>     + * ODP test application common
>     + */
>     +
>     +#include <string.h>
>     +#include <odp.h>
>     +#include "odp_cunit_common.h"
>     +#include "odph_linux.h"
>     +/* Globals */
>     +static odph_linux_pthread_t thread_tbl[MAX_WORKERS];
>     +
>     +/** create test thread */
>     +int odp_cunit_thread_create(void *func_ptr(void *), pthrd_arg *arg)
>     +{
>     +       /* Create and init additional threads */
>     +       odph_linux_pthread_create(thread_tbl, arg->numthrds, 0,
>     func_ptr,
>     +                                 (void *)arg);
>     +
>     +       return 0;
>     +}
>     +
>     +/** exit from test thread */
>     +int odp_cunit_thread_exit(pthrd_arg *arg)
>     +{
>     +       /* Wait for other threads to exit */
>     +       odph_linux_pthread_join(thread_tbl, arg->numthrds);
>     +
>     +       return 0;
>     +}
>     diff --git a/test/validation/odp_cunit_common.h
>     b/test/validation/odp_cunit_common.h
>     new file mode 100644
>     index 0000000..f6eb332
>     --- /dev/null
>     +++ b/test/validation/odp_cunit_common.h
>     @@ -0,0 +1,41 @@
>     +/* Copyright (c) 2014, Linaro Limited
>     + * All rights reserved.
>     + *
>     + * SPDX-License-Identifier:     BSD-3-Clause
>     + */
>     +
>     +/**
>     + * @file
>     + *
>     + * ODP test application common headers
>     + */
>     +
>     +#ifndef ODP_CUNICT_COMMON_H
>     +#define ODP_CUNICT_COMMON_H
>     +
>     +#define MAX_WORKERS 32 /**< Maximum number of work threads */
>     +
>     +typedef struct {
>     +       int foo;
>     +       int bar;
>     +} test_shared_data_t;
>     +
>     +/** types of tests */
>     +typedef enum {
>     +       ODP_SHM_TEST = 0,
>     +       ODP_MAX_TEST
>     +} odp_test_case_e;
>     +
>     +/**
>     + * Thread argument
>     + */
>     +typedef struct {
>     +       int testcase; /**< specifies which set of API's to exercise */
>     +       int numthrds; /**< no of pthreads to create */
>     +} pthrd_arg;
>     +
>     +/** create thread fro start_routine function */
>     +extern int odp_cunit_thread_create(void *func_ptr(void *),
>     pthrd_arg *arg);
>     +extern int odp_cunit_thread_exit(pthrd_arg *);
>     +
>     +#endif /* ODP_COMMON_H */
>     diff --git a/test/validation/odp_shm.c b/test/validation/odp_shm.c
>     new file mode 100644
>     index 0000000..fea3620
>     --- /dev/null
>     +++ b/test/validation/odp_shm.c
>     @@ -0,0 +1,121 @@
>     +/* Copyright (c) 2014, Linaro Limited
>     + * All rights reserved.
>     + *
>     + * SPDX-License-Identifier:     BSD-3-Clause
>     + */
>     +
>     +#include "odp.h"
>     +#include "CUnit/Basic.h"
>     +#include "odp_cunit_common.h"
>     +
>     +#define ALIGE_SIZE  (128)
>     +#define TESTNAME "cunit_test_shared_data"
>     +
>     +odp_shm_t shm;
>     +
>     +__thread test_shared_data_t *test_shared_data;
>     +static void *run_shm_thread(void *arg)
>     +{
>     +       pthrd_arg *parg = (pthrd_arg *)arg;
>     +       odp_shm_info_t  info;
>     +       int thr;
>     +
>     +       thr = odp_thread_id();
>     +
>     +       printf("Thread %i starts\n", thr);
>     +
>     +       switch (parg->testcase) {
>     +       case ODP_SHM_TEST:
>     +               shm = odp_shm_lookup(TESTNAME);
>     +               CU_ASSERT(ODP_SHM_INVALID != shm);
>     +               test_shared_data = odp_shm_addr(shm);
>     +               CU_ASSERT(0 == odp_shm_info(shm, &info));
>     +               CU_ASSERT(0 == strcmp(TESTNAME, info.name
>     <http://info.name>));
>     +               CU_ASSERT(0 == info.flags);
>     +               CU_ASSERT(test_shared_data == info.addr);
>     +               CU_ASSERT(sizeof(test_shared_data_t) == info.size);
>     +               CU_ASSERT(odp_sys_page_size() == info.page_size);
>     +               odp_shm_print_all();
>     +               break;
>     +       default:
>     +               printf("Invalid test case [%d]\n", parg->testcase);
>     +       }
>     +       fflush(stdout);
>     +       return parg;
>     +}
>     +
>     +static void test_odp_shm_sunnyday(void)
>     +{
>     +       pthrd_arg thrdarg;
>     +
>     +       shm = odp_shm_reserve(TESTNAME,
>     +                             sizeof(test_shared_data_t),
>     ALIGE_SIZE, 0);
>     +       CU_ASSERT(ODP_SHM_INVALID != shm);
>     +
>     +       CU_ASSERT(0 == odp_shm_free(shm));
>     +       CU_ASSERT(ODP_SHM_INVALID == odp_shm_lookup(TESTNAME));
>     +
>     +       shm = odp_shm_reserve(TESTNAME,
>     +                             sizeof(test_shared_data_t),
>     ALIGE_SIZE, 0);
>     +       CU_ASSERT(ODP_SHM_INVALID != shm);
>     +
>     +       test_shared_data = odp_shm_addr(shm);
>     +       CU_ASSERT(NULL != test_shared_data);
>     +       memset(test_shared_data, 0, sizeof(test_shared_data_t));
>     +
>     +       thrdarg.testcase = ODP_SHM_TEST;
>     +       thrdarg.numthrds = odp_sys_core_count();
>     +
>     +       if (thrdarg.numthrds > MAX_WORKERS)
>     +               thrdarg.numthrds = MAX_WORKERS;
>     +
>     +       odp_cunit_thread_create(run_shm_thread, &thrdarg);
>     +       odp_cunit_thread_exit(&thrdarg);
>     +}
>     +
>     +static int finalize(void)
>     +{
>     +       odp_term_local();
>     +       odp_term_global();
>     +       return 0;
>     +}
>     +
>     +static int init(void)
>     +{
>
>     +      if (0 != odp_init_global(NULL, NULL)) {
>     +               printf("odp_init_global fail.\n");
>     +               return -1;
>     +       }
>     +       if (0 != odp_init_local()) {
>     +               printf("odp_init_local fail.\n");
>     +               return -1;
>     +       }
>     +       return 0;
>     +}
>     +
>     +int main(void)
>     +{
>     +       CU_pSuite ptr_suite;
>     +
>     +       /* initialize the CUnit test registry */
>     +       if (CUE_SUCCESS != CU_initialize_registry())
>     +               return CU_get_error();
>
>     +
>     +       /* add the tests to the shm suite */
>     +       ptr_suite = CU_add_suite(__FILE__, init, finalize);
>     +       if (!ptr_suite) {
>     +               CU_cleanup_registry();
>     +               return CU_get_error();
>     +       }
>
>
> This is a different style of test framework failure exit to the one 
> that Stuarts patch provided which returned -1 and we should get all 
> the tests working the same way,
>
> I wonder if we should use void *CU_set_error_action*(CU_ErrorAction 
> action) and set CUEA_ABORT which results in the application calling 
> exit() when an error occurs in the framework
> (but not in the asserts in the actual tests, they work as before).
>
> This means we don't need to add checks to the return codes  in the 
> tests for the CU_* calls, we also no longer have to add and prints to 
> stderr to explain the situation making the test framework less 
> intrusive in the test code.
> To test this I added this call to set the exit behavior and then 
> forced a framework error by passing null into AC_ADD_TEST and got the 
> following in the two run scenarios, and it works well I think
>
>
> $ make check
> ...
> make[4]: Entering directory '/home/mike/git/odp/test/validation'
> FAIL: odp_init
> PASS: odp_queue
> PASS: odp_crypto
> make[5]: Entering directory '/home/mike/git/odp/test/validation'
> make[5]: Nothing to be done for 'all'.
> make[5]: Leaving directory '/home/mike/git/odp/test/validation'
> ============================================================================
> Testsuite summary for OpenDataPlane 0.3.0
> ============================================================================
> # TOTAL: 3
> # PASS:  2
> # SKIP:  0
> # XFAIL: 0
> # FAIL:  1
> # XPASS: 0
> # ERROR: 0
> ============================================================================
> See test/validation/test-suite.log
> Please report to lng-odp@lists.linaro.org 
> <mailto:lng-odp@lists.linaro.org>
> ============================================================================
>
> And it looks like this when called directly
>
> $ test/validation/odp_init
> Aborting due to error #20: NULL suite not allowed.
>
>
>
>
>     +
>     +       if (NULL == CU_ADD_TEST(ptr_suite, test_odp_shm_sunnyday)) {
>     +               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();
>     +       CU_cleanup_registry();
>     +       return CU_get_error();
>
>
>
>
>
>     +}
>     --
>     1.8.3.1
>
>
>     _______________________________________________
>     lng-odp mailing list
>     lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>
>     http://lists.linaro.org/mailman/listinfo/lng-odp
>
>
>
>
> -- 
> *Mike Holmes*
> Linaro  Sr Technical Manager
> LNG - ODP
>
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/lng-odp
yan.songming Nov. 24, 2014, 5:46 a.m. UTC | #2
Hi Maxim,

You meaning i should update my  .gitignore ?
How do you know that ?
I only know it is the rule to ignore some file or Directory in git.

Thanks,


yan.songming@linaro.org
 
From: Maxim Uvarov

Date: 2014-11-23 20:50
To: lng-odp
Subject: Re: [lng-odp] [PATCH v2] cunit: add shm test
you also need to update .gitignore.
 
Maxim.
 
On 11/21/2014 11:42 PM, Mike Holmes wrote:
> It looks like this needs to be revised to match the rules as they have 

> evolved this week.

>

> On 20 November 2014 09:54, Yan Songming <yan.songming@linaro.org 

> <mailto:yan.songming@linaro.org>> wrote:

>

>     Add odp_cunit_common.c for common cunit function and add the cunit

>     test for the api in odp_share_memory.h which include the new api

>     implement

>     odp_shm_free.

>

>     Signed-off-by: Yan Songming <yan.songming@linaro.org

>     <mailto:yan.songming@linaro.org>>

>     ---

>     v2 fix some problem which maxim and mike found.

>     ---

>      test/validation/Makefile.am        |   4 +-

>      test/validation/odp_cunit_common.c |  37 ++++++++++++

>      test/validation/odp_cunit_common.h |  41 +++++++++++++

>

>

> This breaks the rule that test/validation contain only the main entry 

> point for the tests, if we like this file and think it can contain 

> multiple useful functions for unit testing I propose it lives in 

> test/validation/common

>

>      test/validation/odp_shm.c         | 121

>     +++++++++++++++++++++++++++++++++++++

>      4 files changed, 202 insertions(+), 1 deletion(-)

>      create mode 100644 test/validation/odp_cunit_common.c

>      create mode 100644 test/validation/odp_cunit_common.h

>      create mode 100644 test/validation/odp_shm.c

>

>     diff --git a/test/validation/Makefile.am b/test/validation/Makefile.am

>     index 2e1b991..5992f72 100644

>     --- a/test/validation/Makefile.am

>     +++ b/test/validation/Makefile.am

>     @@ -6,11 +6,12 @@ AM_LDFLAGS += -L$(CUNIT_PATH)/lib -static -lcunit

>      if ODP_CUNIT_ENABLED

>      TESTS = ${bin_PROGRAMS}

>      check_PROGRAMS = ${bin_PROGRAMS}

>     -bin_PROGRAMS = odp_init odp_queue odp_crypto

>     +bin_PROGRAMS = odp_init odp_queue odp_crypto odp_shm

>      odp_init_LDFLAGS = $(AM_LDFLAGS)

>      odp_queue_LDFLAGS = $(AM_LDFLAGS)

>      odp_crypto_CFLAGS = $(AM_CFLAGS) -I./crypto

>      odp_crypto_LDFLAGS = $(AM_LDFLAGS)

>     +odp_shm_LDFLAGS = $(AM_LDFLAGS)

>      endif

>

>      dist_odp_init_SOURCES = odp_init.c

>     @@ -18,3 +19,4 @@ dist_odp_queue_SOURCES = odp_queue.c

>      dist_odp_crypto_SOURCES = crypto/odp_crypto_test_async_inp.c \

>     crypto/odp_crypto_test_sync_inp.c \

>                               odp_crypto.c

>     +dist_odp_shm_SOURCES = odp_shm.c odp_cunit_common.c

>     diff --git a/test/validation/odp_cunit_common.c

>     b/test/validation/odp_cunit_common.c

>     new file mode 100644

>     index 0000000..885b981

>     --- /dev/null

>     +++ b/test/validation/odp_cunit_common.c

>     @@ -0,0 +1,37 @@

>     +/* Copyright (c) 2014, Linaro Limited

>     + * All rights reserved.

>     + *

>     + * SPDX-License-Identifier:     BSD-3-Clause

>     + */

>     +

>     +/**

>     + * @file

>     + *

>     + * ODP test application common

>     + */

>     +

>     +#include <string.h>

>     +#include <odp.h>

>     +#include "odp_cunit_common.h"

>     +#include "odph_linux.h"

>     +/* Globals */

>     +static odph_linux_pthread_t thread_tbl[MAX_WORKERS];

>     +

>     +/** create test thread */

>     +int odp_cunit_thread_create(void *func_ptr(void *), pthrd_arg *arg)

>     +{

>     +       /* Create and init additional threads */

>     +       odph_linux_pthread_create(thread_tbl, arg->numthrds, 0,

>     func_ptr,

>     +                                 (void *)arg);

>     +

>     +       return 0;

>     +}

>     +

>     +/** exit from test thread */

>     +int odp_cunit_thread_exit(pthrd_arg *arg)

>     +{

>     +       /* Wait for other threads to exit */

>     +       odph_linux_pthread_join(thread_tbl, arg->numthrds);

>     +

>     +       return 0;

>     +}

>     diff --git a/test/validation/odp_cunit_common.h

>     b/test/validation/odp_cunit_common.h

>     new file mode 100644

>     index 0000000..f6eb332

>     --- /dev/null

>     +++ b/test/validation/odp_cunit_common.h

>     @@ -0,0 +1,41 @@

>     +/* Copyright (c) 2014, Linaro Limited

>     + * All rights reserved.

>     + *

>     + * SPDX-License-Identifier:     BSD-3-Clause

>     + */

>     +

>     +/**

>     + * @file

>     + *

>     + * ODP test application common headers

>     + */

>     +

>     +#ifndef ODP_CUNICT_COMMON_H

>     +#define ODP_CUNICT_COMMON_H

>     +

>     +#define MAX_WORKERS 32 /**< Maximum number of work threads */

>     +

>     +typedef struct {

>     +       int foo;

>     +       int bar;

>     +} test_shared_data_t;

>     +

>     +/** types of tests */

>     +typedef enum {

>     +       ODP_SHM_TEST = 0,

>     +       ODP_MAX_TEST

>     +} odp_test_case_e;

>     +

>     +/**

>     + * Thread argument

>     + */

>     +typedef struct {

>     +       int testcase; /**< specifies which set of API's to exercise */

>     +       int numthrds; /**< no of pthreads to create */

>     +} pthrd_arg;

>     +

>     +/** create thread fro start_routine function */

>     +extern int odp_cunit_thread_create(void *func_ptr(void *),

>     pthrd_arg *arg);

>     +extern int odp_cunit_thread_exit(pthrd_arg *);

>     +

>     +#endif /* ODP_COMMON_H */

>     diff --git a/test/validation/odp_shm.c b/test/validation/odp_shm.c

>     new file mode 100644

>     index 0000000..fea3620

>     --- /dev/null

>     +++ b/test/validation/odp_shm.c

>     @@ -0,0 +1,121 @@

>     +/* Copyright (c) 2014, Linaro Limited

>     + * All rights reserved.

>     + *

>     + * SPDX-License-Identifier:     BSD-3-Clause

>     + */

>     +

>     +#include "odp.h"

>     +#include "CUnit/Basic.h"

>     +#include "odp_cunit_common.h"

>     +

>     +#define ALIGE_SIZE  (128)

>     +#define TESTNAME "cunit_test_shared_data"

>     +

>     +odp_shm_t shm;

>     +

>     +__thread test_shared_data_t *test_shared_data;

>     +static void *run_shm_thread(void *arg)

>     +{

>     +       pthrd_arg *parg = (pthrd_arg *)arg;

>     +       odp_shm_info_t  info;

>     +       int thr;

>     +

>     +       thr = odp_thread_id();

>     +

>     +       printf("Thread %i starts\n", thr);

>     +

>     +       switch (parg->testcase) {

>     +       case ODP_SHM_TEST:

>     +               shm = odp_shm_lookup(TESTNAME);

>     +               CU_ASSERT(ODP_SHM_INVALID != shm);

>     +               test_shared_data = odp_shm_addr(shm);

>     +               CU_ASSERT(0 == odp_shm_info(shm, &info));

>     +               CU_ASSERT(0 == strcmp(TESTNAME, info.name

>     <http://info.name>));

>     +               CU_ASSERT(0 == info.flags);

>     +               CU_ASSERT(test_shared_data == info.addr);

>     +               CU_ASSERT(sizeof(test_shared_data_t) == info.size);

>     +               CU_ASSERT(odp_sys_page_size() == info.page_size);

>     +               odp_shm_print_all();

>     +               break;

>     +       default:

>     +               printf("Invalid test case [%d]\n", parg->testcase);

>     +       }

>     +       fflush(stdout);

>     +       return parg;

>     +}

>     +

>     +static void test_odp_shm_sunnyday(void)

>     +{

>     +       pthrd_arg thrdarg;

>     +

>     +       shm = odp_shm_reserve(TESTNAME,

>     +                             sizeof(test_shared_data_t),

>     ALIGE_SIZE, 0);

>     +       CU_ASSERT(ODP_SHM_INVALID != shm);

>     +

>     +       CU_ASSERT(0 == odp_shm_free(shm));

>     +       CU_ASSERT(ODP_SHM_INVALID == odp_shm_lookup(TESTNAME));

>     +

>     +       shm = odp_shm_reserve(TESTNAME,

>     +                             sizeof(test_shared_data_t),

>     ALIGE_SIZE, 0);

>     +       CU_ASSERT(ODP_SHM_INVALID != shm);

>     +

>     +       test_shared_data = odp_shm_addr(shm);

>     +       CU_ASSERT(NULL != test_shared_data);

>     +       memset(test_shared_data, 0, sizeof(test_shared_data_t));

>     +

>     +       thrdarg.testcase = ODP_SHM_TEST;

>     +       thrdarg.numthrds = odp_sys_core_count();

>     +

>     +       if (thrdarg.numthrds > MAX_WORKERS)

>     +               thrdarg.numthrds = MAX_WORKERS;

>     +

>     +       odp_cunit_thread_create(run_shm_thread, &thrdarg);

>     +       odp_cunit_thread_exit(&thrdarg);

>     +}

>     +

>     +static int finalize(void)

>     +{

>     +       odp_term_local();

>     +       odp_term_global();

>     +       return 0;

>     +}

>     +

>     +static int init(void)

>     +{

>

>     +      if (0 != odp_init_global(NULL, NULL)) {

>     +               printf("odp_init_global fail.\n");

>     +               return -1;

>     +       }

>     +       if (0 != odp_init_local()) {

>     +               printf("odp_init_local fail.\n");

>     +               return -1;

>     +       }

>     +       return 0;

>     +}

>     +

>     +int main(void)

>     +{

>     +       CU_pSuite ptr_suite;

>     +

>     +       /* initialize the CUnit test registry */

>     +       if (CUE_SUCCESS != CU_initialize_registry())

>     +               return CU_get_error();

>

>     +

>     +       /* add the tests to the shm suite */

>     +       ptr_suite = CU_add_suite(__FILE__, init, finalize);

>     +       if (!ptr_suite) {

>     +               CU_cleanup_registry();

>     +               return CU_get_error();

>     +       }

>

>

> This is a different style of test framework failure exit to the one 

> that Stuarts patch provided which returned -1 and we should get all 

> the tests working the same way,

>

> I wonder if we should use void *CU_set_error_action*(CU_ErrorAction 

> action) and set CUEA_ABORT which results in the application calling 

> exit() when an error occurs in the framework

> (but not in the asserts in the actual tests, they work as before).

>

> This means we don't need to add checks to the return codes  in the 

> tests for the CU_* calls, we also no longer have to add and prints to 

> stderr to explain the situation making the test framework less 

> intrusive in the test code.

> To test this I added this call to set the exit behavior and then 

> forced a framework error by passing null into AC_ADD_TEST and got the 

> following in the two run scenarios, and it works well I think

>

>

> $ make check

> ...

> make[4]: Entering directory '/home/mike/git/odp/test/validation'

> FAIL: odp_init

> PASS: odp_queue

> PASS: odp_crypto

> make[5]: Entering directory '/home/mike/git/odp/test/validation'

> make[5]: Nothing to be done for 'all'.

> make[5]: Leaving directory '/home/mike/git/odp/test/validation'

> ============================================================================

> Testsuite summary for OpenDataPlane 0.3.0

> ============================================================================

> # TOTAL: 3

> # PASS:  2

> # SKIP:  0

> # XFAIL: 0

> # FAIL:  1

> # XPASS: 0

> # ERROR: 0

> ============================================================================

> See test/validation/test-suite.log

> Please report to lng-odp@lists.linaro.org 

> <mailto:lng-odp@lists.linaro.org>

> ============================================================================

>

> And it looks like this when called directly

>

> $ test/validation/odp_init

> Aborting due to error #20: NULL suite not allowed.

>

>

>

>

>     +

>     +       if (NULL == CU_ADD_TEST(ptr_suite, test_odp_shm_sunnyday)) {

>     +               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();

>     +       CU_cleanup_registry();

>     +       return CU_get_error();

>

>

>

>

>

>     +}

>     --

>     1.8.3.1

>

>

>     _______________________________________________

>     lng-odp mailing list

>     lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>

>     http://lists.linaro.org/mailman/listinfo/lng-odp

>

>

>

>

> -- 

> *Mike Holmes*

> Linaro  Sr Technical Manager

> LNG - ODP

>

>

> _______________________________________________

> lng-odp mailing list

> lng-odp@lists.linaro.org

> http://lists.linaro.org/mailman/listinfo/lng-odp

 
 
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/lng-odp
Maxim Uvarov Nov. 24, 2014, 9:22 a.m. UTC | #3
On 11/24/2014 08:46 AM, yan.songming@linaro.org wrote:
> Hi Maxim,
>
> You meaning i should update my .gitignore ?
> How do you know that ?
> I only know it is the rule to ignore some file or Directory in git.
>

Yes, if you add binary you need to include binary name to .gitignore. 
Add changes to patch and send it.
.gitignore is not local file, it's regular git file.

Maxim.

> Thanks,
> ------------------------------------------------------------------------
> yan.songming@linaro.org
>
>     *From:* Maxim Uvarov <mailto:maxim.uvarov@linaro.org>
>     *Date:* 2014-11-23 20:50
>     *To:* lng-odp <mailto:lng-odp@lists.linaro.org>
>     *Subject:* Re: [lng-odp] [PATCH v2] cunit: add shm test
>     you also need to update .gitignore.
>     Maxim.
>     On 11/21/2014 11:42 PM, Mike Holmes wrote:
>     > It looks like this needs to be revised to match the rules as
>     they have
>     > evolved this week.
>     >
>     > On 20 November 2014 09:54, Yan Songming <yan.songming@linaro.org
>     > <mailto:yan.songming@linaro.org>> wrote:
>     >
>     >     Add odp_cunit_common.c for common cunit function and add the
>     cunit
>     >     test for the api in odp_share_memory.h which include the new api
>     >     implement
>     >     odp_shm_free.
>     >
>     >     Signed-off-by: Yan Songming <yan.songming@linaro.org
>     >     <mailto:yan.songming@linaro.org>>
>     >     ---
>     >     v2 fix some problem which maxim and mike found.
>     >     ---
>     >      test/validation/Makefile.am        |   4 +-
>     >      test/validation/odp_cunit_common.c |  37 ++++++++++++
>     >      test/validation/odp_cunit_common.h |  41 +++++++++++++
>     >
>     >
>     > This breaks the rule that test/validation contain only the main
>     entry
>     > point for the tests, if we like this file and think it can contain
>     > multiple useful functions for unit testing I propose it lives in
>     > test/validation/common
>     >
>     >      test/validation/odp_shm.c         | 121
>     >     +++++++++++++++++++++++++++++++++++++
>     >      4 files changed, 202 insertions(+), 1 deletion(-)
>     >      create mode 100644 test/validation/odp_cunit_common.c
>     >      create mode 100644 test/validation/odp_cunit_common.h
>     >      create mode 100644 test/validation/odp_shm.c
>     >
>     >     diff --git a/test/validation/Makefile.am
>     b/test/validation/Makefile.am
>     >     index 2e1b991..5992f72 100644
>     >     --- a/test/validation/Makefile.am
>     >     +++ b/test/validation/Makefile.am
>     >     @@ -6,11 +6,12 @@ AM_LDFLAGS += -L$(CUNIT_PATH)/lib -static
>     -lcunit
>     >      if ODP_CUNIT_ENABLED
>     >      TESTS = ${bin_PROGRAMS}
>     >      check_PROGRAMS = ${bin_PROGRAMS}
>     >     -bin_PROGRAMS = odp_init odp_queue odp_crypto
>     >     +bin_PROGRAMS = odp_init odp_queue odp_crypto odp_shm
>     >      odp_init_LDFLAGS = $(AM_LDFLAGS)
>     >      odp_queue_LDFLAGS = $(AM_LDFLAGS)
>     >      odp_crypto_CFLAGS = $(AM_CFLAGS) -I./crypto
>     >      odp_crypto_LDFLAGS = $(AM_LDFLAGS)
>     >     +odp_shm_LDFLAGS = $(AM_LDFLAGS)
>     >      endif
>     >
>     >      dist_odp_init_SOURCES = odp_init.c
>     >     @@ -18,3 +19,4 @@ dist_odp_queue_SOURCES = odp_queue.c
>     >      dist_odp_crypto_SOURCES = crypto/odp_crypto_test_async_inp.c \
>     >     crypto/odp_crypto_test_sync_inp.c \
>     >                               odp_crypto.c
>     >     +dist_odp_shm_SOURCES = odp_shm.c odp_cunit_common.c
>     >     diff --git a/test/validation/odp_cunit_common.c
>     >     b/test/validation/odp_cunit_common.c
>     >     new file mode 100644
>     >     index 0000000..885b981
>     >     --- /dev/null
>     >     +++ b/test/validation/odp_cunit_common.c
>     >     @@ -0,0 +1,37 @@
>     >     +/* Copyright (c) 2014, Linaro Limited
>     >     + * All rights reserved.
>     >     + *
>     >     + * SPDX-License-Identifier:     BSD-3-Clause
>     >     + */
>     >     +
>     >     +/**
>     >     + * @file
>     >     + *
>     >     + * ODP test application common
>     >     + */
>     >     +
>     >     +#include <string.h>
>     >     +#include <odp.h>
>     >     +#include "odp_cunit_common.h"
>     >     +#include "odph_linux.h"
>     >     +/* Globals */
>     >     +static odph_linux_pthread_t thread_tbl[MAX_WORKERS];
>     >     +
>     >     +/** create test thread */
>     >     +int odp_cunit_thread_create(void *func_ptr(void *),
>     pthrd_arg *arg)
>     >     +{
>     >     +       /* Create and init additional threads */
>     >     +       odph_linux_pthread_create(thread_tbl, arg->numthrds, 0,
>     >     func_ptr,
>     >     +                                 (void *)arg);
>     >     +
>     >     +       return 0;
>     >     +}
>     >     +
>     >     +/** exit from test thread */
>     >     +int odp_cunit_thread_exit(pthrd_arg *arg)
>     >     +{
>     >     +       /* Wait for other threads to exit */
>     >     +       odph_linux_pthread_join(thread_tbl, arg->numthrds);
>     >     +
>     >     +       return 0;
>     >     +}
>     >     diff --git a/test/validation/odp_cunit_common.h
>     >     b/test/validation/odp_cunit_common.h
>     >     new file mode 100644
>     >     index 0000000..f6eb332
>     >     --- /dev/null
>     >     +++ b/test/validation/odp_cunit_common.h
>     >     @@ -0,0 +1,41 @@
>     >     +/* Copyright (c) 2014, Linaro Limited
>     >     + * All rights reserved.
>     >     + *
>     >     + * SPDX-License-Identifier:     BSD-3-Clause
>     >     + */
>     >     +
>     >     +/**
>     >     + * @file
>     >     + *
>     >     + * ODP test application common headers
>     >     + */
>     >     +
>     >     +#ifndef ODP_CUNICT_COMMON_H
>     >     +#define ODP_CUNICT_COMMON_H
>     >     +
>     >     +#define MAX_WORKERS 32 /**< Maximum number of work threads */
>     >     +
>     >     +typedef struct {
>     >     +       int foo;
>     >     +       int bar;
>     >     +} test_shared_data_t;
>     >     +
>     >     +/** types of tests */
>     >     +typedef enum {
>     >     +       ODP_SHM_TEST = 0,
>     >     +       ODP_MAX_TEST
>     >     +} odp_test_case_e;
>     >     +
>     >     +/**
>     >     + * Thread argument
>     >     + */
>     >     +typedef struct {
>     >     +       int testcase; /**< specifies which set of API's to
>     exercise */
>     >     +       int numthrds; /**< no of pthreads to create */
>     >     +} pthrd_arg;
>     >     +
>     >     +/** create thread fro start_routine function */
>     >     +extern int odp_cunit_thread_create(void *func_ptr(void *),
>     >     pthrd_arg *arg);
>     >     +extern int odp_cunit_thread_exit(pthrd_arg *);
>     >     +
>     >     +#endif /* ODP_COMMON_H */
>     >     diff --git a/test/validation/odp_shm.c
>     b/test/validation/odp_shm.c
>     >     new file mode 100644
>     >     index 0000000..fea3620
>     >     --- /dev/null
>     >     +++ b/test/validation/odp_shm.c
>     >     @@ -0,0 +1,121 @@
>     >     +/* Copyright (c) 2014, Linaro Limited
>     >     + * All rights reserved.
>     >     + *
>     >     + * SPDX-License-Identifier:     BSD-3-Clause
>     >     + */
>     >     +
>     >     +#include "odp.h"
>     >     +#include "CUnit/Basic.h"
>     >     +#include "odp_cunit_common.h"
>     >     +
>     >     +#define ALIGE_SIZE  (128)
>     >     +#define TESTNAME "cunit_test_shared_data"
>     >     +
>     >     +odp_shm_t shm;
>     >     +
>     >     +__thread test_shared_data_t *test_shared_data;
>     >     +static void *run_shm_thread(void *arg)
>     >     +{
>     >     +       pthrd_arg *parg = (pthrd_arg *)arg;
>     >     +       odp_shm_info_t  info;
>     >     +       int thr;
>     >     +
>     >     +       thr = odp_thread_id();
>     >     +
>     >     +       printf("Thread %i starts\n", thr);
>     >     +
>     >     +       switch (parg->testcase) {
>     >     +       case ODP_SHM_TEST:
>     >     +               shm = odp_shm_lookup(TESTNAME);
>     >     +               CU_ASSERT(ODP_SHM_INVALID != shm);
>     >     +               test_shared_data = odp_shm_addr(shm);
>     >     +               CU_ASSERT(0 == odp_shm_info(shm, &info));
>     >     +               CU_ASSERT(0 == strcmp(TESTNAME, info.name
>     >     <http://info.name>));
>     >     +               CU_ASSERT(0 == info.flags);
>     >     +               CU_ASSERT(test_shared_data == info.addr);
>     >     + CU_ASSERT(sizeof(test_shared_data_t) == info.size);
>     >     +               CU_ASSERT(odp_sys_page_size() ==
>     info.page_size);
>     >     +               odp_shm_print_all();
>     >     +               break;
>     >     +       default:
>     >     +               printf("Invalid test case [%d]\n",
>     parg->testcase);
>     >     +       }
>     >     +       fflush(stdout);
>     >     +       return parg;
>     >     +}
>     >     +
>     >     +static void test_odp_shm_sunnyday(void)
>     >     +{
>     >     +       pthrd_arg thrdarg;
>     >     +
>     >     +       shm = odp_shm_reserve(TESTNAME,
>     >     + sizeof(test_shared_data_t),
>     >     ALIGE_SIZE, 0);
>     >     +       CU_ASSERT(ODP_SHM_INVALID != shm);
>     >     +
>     >     +       CU_ASSERT(0 == odp_shm_free(shm));
>     >     +       CU_ASSERT(ODP_SHM_INVALID == odp_shm_lookup(TESTNAME));
>     >     +
>     >     +       shm = odp_shm_reserve(TESTNAME,
>     >     + sizeof(test_shared_data_t),
>     >     ALIGE_SIZE, 0);
>     >     +       CU_ASSERT(ODP_SHM_INVALID != shm);
>     >     +
>     >     +       test_shared_data = odp_shm_addr(shm);
>     >     +       CU_ASSERT(NULL != test_shared_data);
>     >     +       memset(test_shared_data, 0, sizeof(test_shared_data_t));
>     >     +
>     >     +       thrdarg.testcase = ODP_SHM_TEST;
>     >     +       thrdarg.numthrds = odp_sys_core_count();
>     >     +
>     >     +       if (thrdarg.numthrds > MAX_WORKERS)
>     >     +               thrdarg.numthrds = MAX_WORKERS;
>     >     +
>     >     +       odp_cunit_thread_create(run_shm_thread, &thrdarg);
>     >     +       odp_cunit_thread_exit(&thrdarg);
>     >     +}
>     >     +
>     >     +static int finalize(void)
>     >     +{
>     >     +       odp_term_local();
>     >     +       odp_term_global();
>     >     +       return 0;
>     >     +}
>     >     +
>     >     +static int init(void)
>     >     +{
>     >
>     >     +      if (0 != odp_init_global(NULL, NULL)) {
>     >     +               printf("odp_init_global fail.\n");
>     >     +               return -1;
>     >     +       }
>     >     +       if (0 != odp_init_local()) {
>     >     +               printf("odp_init_local fail.\n");
>     >     +               return -1;
>     >     +       }
>     >     +       return 0;
>     >     +}
>     >     +
>     >     +int main(void)
>     >     +{
>     >     +       CU_pSuite ptr_suite;
>     >     +
>     >     +       /* initialize the CUnit test registry */
>     >     +       if (CUE_SUCCESS != CU_initialize_registry())
>     >     +               return CU_get_error();
>     >
>     >     +
>     >     +       /* add the tests to the shm suite */
>     >     +       ptr_suite = CU_add_suite(__FILE__, init, finalize);
>     >     +       if (!ptr_suite) {
>     >     +               CU_cleanup_registry();
>     >     +               return CU_get_error();
>     >     +       }
>     >
>     >
>     > This is a different style of test framework failure exit to the one
>     > that Stuarts patch provided which returned -1 and we should get all
>     > the tests working the same way,
>     >
>     > I wonder if we should use void *CU_set_error_action*(CU_ErrorAction
>     > action) and set CUEA_ABORT which results in the application calling
>     > exit() when an error occurs in the framework
>     > (but not in the asserts in the actual tests, they work as before).
>     >
>     > This means we don't need to add checks to the return codes  in the
>     > tests for the CU_* calls, we also no longer have to add and
>     prints to
>     > stderr to explain the situation making the test framework less
>     > intrusive in the test code.
>     > To test this I added this call to set the exit behavior and then
>     > forced a framework error by passing null into AC_ADD_TEST and
>     got the
>     > following in the two run scenarios, and it works well I think
>     >
>     >
>     > $ make check
>     > ...
>     > make[4]: Entering directory '/home/mike/git/odp/test/validation'
>     > FAIL: odp_init
>     > PASS: odp_queue
>     > PASS: odp_crypto
>     > make[5]: Entering directory '/home/mike/git/odp/test/validation'
>     > make[5]: Nothing to be done for 'all'.
>     > make[5]: Leaving directory '/home/mike/git/odp/test/validation'
>     >
>     ============================================================================
>     > Testsuite summary for OpenDataPlane 0.3.0
>     >
>     ============================================================================
>     > # TOTAL: 3
>     > # PASS:  2
>     > # SKIP:  0
>     > # XFAIL: 0
>     > # FAIL:  1
>     > # XPASS: 0
>     > # ERROR: 0
>     >
>     ============================================================================
>     > See test/validation/test-suite.log
>     > Please report to lng-odp@lists.linaro.org
>     > <mailto:lng-odp@lists.linaro.org>
>     >
>     ============================================================================
>     >
>     > And it looks like this when called directly
>     >
>     > $ test/validation/odp_init
>     > Aborting due to error #20: NULL suite not allowed.
>     >
>     >
>     >
>     >
>     >     +
>     >     +       if (NULL == CU_ADD_TEST(ptr_suite,
>     test_odp_shm_sunnyday)) {
>     >     +               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();
>     >     +       CU_cleanup_registry();
>     >     +       return CU_get_error();
>     >
>     >
>     >
>     >
>     >
>     >     +}
>     >     --
>     >     1.8.3.1
>     >
>     >
>     >     _______________________________________________
>     >     lng-odp mailing list
>     >     lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>
>     >     http://lists.linaro.org/mailman/listinfo/lng-odp
>     >
>     >
>     >
>     >
>     > --
>     > *Mike Holmes*
>     > Linaro  Sr Technical Manager
>     > LNG - ODP
>     >
>     >
>     > _______________________________________________
>     > lng-odp mailing list
>     > lng-odp@lists.linaro.org
>     > http://lists.linaro.org/mailman/listinfo/lng-odp
>     _______________________________________________
>     lng-odp mailing list
>     lng-odp@lists.linaro.org
>     http://lists.linaro.org/mailman/listinfo/lng-odp
>
yan.songming Nov. 25, 2014, 7:46 a.m. UTC | #4
Maxim,
In fact the .gitignore has "odp_shm". But i think it is because there is a same name of it in /odp/test/api_test
So , should i change a name of it and add it to the file ? 



yan.songming@linaro.org
 
From: Maxim Uvarov

Date: 2014-11-24 17:22
To: yan.songming@linaro.org; lng-odp
Subject: Re: [lng-odp] [PATCH v2] cunit: add shm test
On 11/24/2014 08:46 AM, yan.songming@linaro.org wrote:
> Hi Maxim,

>

> You meaning i should update my .gitignore ?

> How do you know that ?

> I only know it is the rule to ignore some file or Directory in git.

>

 
Yes, if you add binary you need to include binary name to .gitignore. 
Add changes to patch and send it.
.gitignore is not local file, it's regular git file.
 
Maxim.
 
> Thanks,

> ------------------------------------------------------------------------

> yan.songming@linaro.org

>

>     *From:* Maxim Uvarov <mailto:maxim.uvarov@linaro.org>

>     *Date:* 2014-11-23 20:50

>     *To:* lng-odp <mailto:lng-odp@lists.linaro.org>

>     *Subject:* Re: [lng-odp] [PATCH v2] cunit: add shm test

>     you also need to update .gitignore.

>     Maxim.

>     On 11/21/2014 11:42 PM, Mike Holmes wrote:

>     > It looks like this needs to be revised to match the rules as

>     they have

>     > evolved this week.

>     >

>     > On 20 November 2014 09:54, Yan Songming <yan.songming@linaro.org

>     > <mailto:yan.songming@linaro.org>> wrote:

>     >

>     >     Add odp_cunit_common.c for common cunit function and add the

>     cunit

>     >     test for the api in odp_share_memory.h which include the new api

>     >     implement

>     >     odp_shm_free.

>     >

>     >     Signed-off-by: Yan Songming <yan.songming@linaro.org

>     >     <mailto:yan.songming@linaro.org>>

>     >     ---

>     >     v2 fix some problem which maxim and mike found.

>     >     ---

>     >      test/validation/Makefile.am        |   4 +-

>     >      test/validation/odp_cunit_common.c |  37 ++++++++++++

>     >      test/validation/odp_cunit_common.h |  41 +++++++++++++

>     >

>     >

>     > This breaks the rule that test/validation contain only the main

>     entry

>     > point for the tests, if we like this file and think it can contain

>     > multiple useful functions for unit testing I propose it lives in

>     > test/validation/common

>     >

>     >      test/validation/odp_shm.c         | 121

>     >     +++++++++++++++++++++++++++++++++++++

>     >      4 files changed, 202 insertions(+), 1 deletion(-)

>     >      create mode 100644 test/validation/odp_cunit_common.c

>     >      create mode 100644 test/validation/odp_cunit_common.h

>     >      create mode 100644 test/validation/odp_shm.c

>     >

>     >     diff --git a/test/validation/Makefile.am

>     b/test/validation/Makefile.am

>     >     index 2e1b991..5992f72 100644

>     >     --- a/test/validation/Makefile.am

>     >     +++ b/test/validation/Makefile.am

>     >     @@ -6,11 +6,12 @@ AM_LDFLAGS += -L$(CUNIT_PATH)/lib -static

>     -lcunit

>     >      if ODP_CUNIT_ENABLED

>     >      TESTS = ${bin_PROGRAMS}

>     >      check_PROGRAMS = ${bin_PROGRAMS}

>     >     -bin_PROGRAMS = odp_init odp_queue odp_crypto

>     >     +bin_PROGRAMS = odp_init odp_queue odp_crypto odp_shm

>     >      odp_init_LDFLAGS = $(AM_LDFLAGS)

>     >      odp_queue_LDFLAGS = $(AM_LDFLAGS)

>     >      odp_crypto_CFLAGS = $(AM_CFLAGS) -I./crypto

>     >      odp_crypto_LDFLAGS = $(AM_LDFLAGS)

>     >     +odp_shm_LDFLAGS = $(AM_LDFLAGS)

>     >      endif

>     >

>     >      dist_odp_init_SOURCES = odp_init.c

>     >     @@ -18,3 +19,4 @@ dist_odp_queue_SOURCES = odp_queue.c

>     >      dist_odp_crypto_SOURCES = crypto/odp_crypto_test_async_inp.c \

>     >     crypto/odp_crypto_test_sync_inp.c \

>     >                               odp_crypto.c

>     >     +dist_odp_shm_SOURCES = odp_shm.c odp_cunit_common.c

>     >     diff --git a/test/validation/odp_cunit_common.c

>     >     b/test/validation/odp_cunit_common.c

>     >     new file mode 100644

>     >     index 0000000..885b981

>     >     --- /dev/null

>     >     +++ b/test/validation/odp_cunit_common.c

>     >     @@ -0,0 +1,37 @@

>     >     +/* Copyright (c) 2014, Linaro Limited

>     >     + * All rights reserved.

>     >     + *

>     >     + * SPDX-License-Identifier:     BSD-3-Clause

>     >     + */

>     >     +

>     >     +/**

>     >     + * @file

>     >     + *

>     >     + * ODP test application common

>     >     + */

>     >     +

>     >     +#include <string.h>

>     >     +#include <odp.h>

>     >     +#include "odp_cunit_common.h"

>     >     +#include "odph_linux.h"

>     >     +/* Globals */

>     >     +static odph_linux_pthread_t thread_tbl[MAX_WORKERS];

>     >     +

>     >     +/** create test thread */

>     >     +int odp_cunit_thread_create(void *func_ptr(void *),

>     pthrd_arg *arg)

>     >     +{

>     >     +       /* Create and init additional threads */

>     >     +       odph_linux_pthread_create(thread_tbl, arg->numthrds, 0,

>     >     func_ptr,

>     >     +                                 (void *)arg);

>     >     +

>     >     +       return 0;

>     >     +}

>     >     +

>     >     +/** exit from test thread */

>     >     +int odp_cunit_thread_exit(pthrd_arg *arg)

>     >     +{

>     >     +       /* Wait for other threads to exit */

>     >     +       odph_linux_pthread_join(thread_tbl, arg->numthrds);

>     >     +

>     >     +       return 0;

>     >     +}

>     >     diff --git a/test/validation/odp_cunit_common.h

>     >     b/test/validation/odp_cunit_common.h

>     >     new file mode 100644

>     >     index 0000000..f6eb332

>     >     --- /dev/null

>     >     +++ b/test/validation/odp_cunit_common.h

>     >     @@ -0,0 +1,41 @@

>     >     +/* Copyright (c) 2014, Linaro Limited

>     >     + * All rights reserved.

>     >     + *

>     >     + * SPDX-License-Identifier:     BSD-3-Clause

>     >     + */

>     >     +

>     >     +/**

>     >     + * @file

>     >     + *

>     >     + * ODP test application common headers

>     >     + */

>     >     +

>     >     +#ifndef ODP_CUNICT_COMMON_H

>     >     +#define ODP_CUNICT_COMMON_H

>     >     +

>     >     +#define MAX_WORKERS 32 /**< Maximum number of work threads */

>     >     +

>     >     +typedef struct {

>     >     +       int foo;

>     >     +       int bar;

>     >     +} test_shared_data_t;

>     >     +

>     >     +/** types of tests */

>     >     +typedef enum {

>     >     +       ODP_SHM_TEST = 0,

>     >     +       ODP_MAX_TEST

>     >     +} odp_test_case_e;

>     >     +

>     >     +/**

>     >     + * Thread argument

>     >     + */

>     >     +typedef struct {

>     >     +       int testcase; /**< specifies which set of API's to

>     exercise */

>     >     +       int numthrds; /**< no of pthreads to create */

>     >     +} pthrd_arg;

>     >     +

>     >     +/** create thread fro start_routine function */

>     >     +extern int odp_cunit_thread_create(void *func_ptr(void *),

>     >     pthrd_arg *arg);

>     >     +extern int odp_cunit_thread_exit(pthrd_arg *);

>     >     +

>     >     +#endif /* ODP_COMMON_H */

>     >     diff --git a/test/validation/odp_shm.c

>     b/test/validation/odp_shm.c

>     >     new file mode 100644

>     >     index 0000000..fea3620

>     >     --- /dev/null

>     >     +++ b/test/validation/odp_shm.c

>     >     @@ -0,0 +1,121 @@

>     >     +/* Copyright (c) 2014, Linaro Limited

>     >     + * All rights reserved.

>     >     + *

>     >     + * SPDX-License-Identifier:     BSD-3-Clause

>     >     + */

>     >     +

>     >     +#include "odp.h"

>     >     +#include "CUnit/Basic.h"

>     >     +#include "odp_cunit_common.h"

>     >     +

>     >     +#define ALIGE_SIZE  (128)

>     >     +#define TESTNAME "cunit_test_shared_data"

>     >     +

>     >     +odp_shm_t shm;

>     >     +

>     >     +__thread test_shared_data_t *test_shared_data;

>     >     +static void *run_shm_thread(void *arg)

>     >     +{

>     >     +       pthrd_arg *parg = (pthrd_arg *)arg;

>     >     +       odp_shm_info_t  info;

>     >     +       int thr;

>     >     +

>     >     +       thr = odp_thread_id();

>     >     +

>     >     +       printf("Thread %i starts\n", thr);

>     >     +

>     >     +       switch (parg->testcase) {

>     >     +       case ODP_SHM_TEST:

>     >     +               shm = odp_shm_lookup(TESTNAME);

>     >     +               CU_ASSERT(ODP_SHM_INVALID != shm);

>     >     +               test_shared_data = odp_shm_addr(shm);

>     >     +               CU_ASSERT(0 == odp_shm_info(shm, &info));

>     >     +               CU_ASSERT(0 == strcmp(TESTNAME, info.name

>     >     <http://info.name>));

>     >     +               CU_ASSERT(0 == info.flags);

>     >     +               CU_ASSERT(test_shared_data == info.addr);

>     >     + CU_ASSERT(sizeof(test_shared_data_t) == info.size);

>     >     +               CU_ASSERT(odp_sys_page_size() ==

>     info.page_size);

>     >     +               odp_shm_print_all();

>     >     +               break;

>     >     +       default:

>     >     +               printf("Invalid test case [%d]\n",

>     parg->testcase);

>     >     +       }

>     >     +       fflush(stdout);

>     >     +       return parg;

>     >     +}

>     >     +

>     >     +static void test_odp_shm_sunnyday(void)

>     >     +{

>     >     +       pthrd_arg thrdarg;

>     >     +

>     >     +       shm = odp_shm_reserve(TESTNAME,

>     >     + sizeof(test_shared_data_t),

>     >     ALIGE_SIZE, 0);

>     >     +       CU_ASSERT(ODP_SHM_INVALID != shm);

>     >     +

>     >     +       CU_ASSERT(0 == odp_shm_free(shm));

>     >     +       CU_ASSERT(ODP_SHM_INVALID == odp_shm_lookup(TESTNAME));

>     >     +

>     >     +       shm = odp_shm_reserve(TESTNAME,

>     >     + sizeof(test_shared_data_t),

>     >     ALIGE_SIZE, 0);

>     >     +       CU_ASSERT(ODP_SHM_INVALID != shm);

>     >     +

>     >     +       test_shared_data = odp_shm_addr(shm);

>     >     +       CU_ASSERT(NULL != test_shared_data);

>     >     +       memset(test_shared_data, 0, sizeof(test_shared_data_t));

>     >     +

>     >     +       thrdarg.testcase = ODP_SHM_TEST;

>     >     +       thrdarg.numthrds = odp_sys_core_count();

>     >     +

>     >     +       if (thrdarg.numthrds > MAX_WORKERS)

>     >     +               thrdarg.numthrds = MAX_WORKERS;

>     >     +

>     >     +       odp_cunit_thread_create(run_shm_thread, &thrdarg);

>     >     +       odp_cunit_thread_exit(&thrdarg);

>     >     +}

>     >     +

>     >     +static int finalize(void)

>     >     +{

>     >     +       odp_term_local();

>     >     +       odp_term_global();

>     >     +       return 0;

>     >     +}

>     >     +

>     >     +static int init(void)

>     >     +{

>     >

>     >     +      if (0 != odp_init_global(NULL, NULL)) {

>     >     +               printf("odp_init_global fail.\n");

>     >     +               return -1;

>     >     +       }

>     >     +       if (0 != odp_init_local()) {

>     >     +               printf("odp_init_local fail.\n");

>     >     +               return -1;

>     >     +       }

>     >     +       return 0;

>     >     +}

>     >     +

>     >     +int main(void)

>     >     +{

>     >     +       CU_pSuite ptr_suite;

>     >     +

>     >     +       /* initialize the CUnit test registry */

>     >     +       if (CUE_SUCCESS != CU_initialize_registry())

>     >     +               return CU_get_error();

>     >

>     >     +

>     >     +       /* add the tests to the shm suite */

>     >     +       ptr_suite = CU_add_suite(__FILE__, init, finalize);

>     >     +       if (!ptr_suite) {

>     >     +               CU_cleanup_registry();

>     >     +               return CU_get_error();

>     >     +       }

>     >

>     >

>     > This is a different style of test framework failure exit to the one

>     > that Stuarts patch provided which returned -1 and we should get all

>     > the tests working the same way,

>     >

>     > I wonder if we should use void *CU_set_error_action*(CU_ErrorAction

>     > action) and set CUEA_ABORT which results in the application calling

>     > exit() when an error occurs in the framework

>     > (but not in the asserts in the actual tests, they work as before).

>     >

>     > This means we don't need to add checks to the return codes  in the

>     > tests for the CU_* calls, we also no longer have to add and

>     prints to

>     > stderr to explain the situation making the test framework less

>     > intrusive in the test code.

>     > To test this I added this call to set the exit behavior and then

>     > forced a framework error by passing null into AC_ADD_TEST and

>     got the

>     > following in the two run scenarios, and it works well I think

>     >

>     >

>     > $ make check

>     > ...

>     > make[4]: Entering directory '/home/mike/git/odp/test/validation'

>     > FAIL: odp_init

>     > PASS: odp_queue

>     > PASS: odp_crypto

>     > make[5]: Entering directory '/home/mike/git/odp/test/validation'

>     > make[5]: Nothing to be done for 'all'.

>     > make[5]: Leaving directory '/home/mike/git/odp/test/validation'

>     >

>     ============================================================================

>     > Testsuite summary for OpenDataPlane 0.3.0

>     >

>     ============================================================================

>     > # TOTAL: 3

>     > # PASS:  2

>     > # SKIP:  0

>     > # XFAIL: 0

>     > # FAIL:  1

>     > # XPASS: 0

>     > # ERROR: 0

>     >

>     ============================================================================

>     > See test/validation/test-suite.log

>     > Please report to lng-odp@lists.linaro.org

>     > <mailto:lng-odp@lists.linaro.org>

>     >

>     ============================================================================

>     >

>     > And it looks like this when called directly

>     >

>     > $ test/validation/odp_init

>     > Aborting due to error #20: NULL suite not allowed.

>     >

>     >

>     >

>     >

>     >     +

>     >     +       if (NULL == CU_ADD_TEST(ptr_suite,

>     test_odp_shm_sunnyday)) {

>     >     +               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();

>     >     +       CU_cleanup_registry();

>     >     +       return CU_get_error();

>     >

>     >

>     >

>     >

>     >

>     >     +}

>     >     --

>     >     1.8.3.1

>     >

>     >

>     >     _______________________________________________

>     >     lng-odp mailing list

>     >     lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>

>     >     http://lists.linaro.org/mailman/listinfo/lng-odp

>     >

>     >

>     >

>     >

>     > --

>     > *Mike Holmes*

>     > Linaro  Sr Technical Manager

>     > LNG - ODP

>     >

>     >

>     > _______________________________________________

>     > lng-odp mailing list

>     > lng-odp@lists.linaro.org

>     > http://lists.linaro.org/mailman/listinfo/lng-odp

>     _______________________________________________

>     lng-odp mailing list

>     lng-odp@lists.linaro.org

>     http://lists.linaro.org/mailman/listinfo/lng-odp

>
Maxim Uvarov Nov. 25, 2014, 9:27 a.m. UTC | #5
On 11/25/2014 10:46 AM, yan.songming@linaro.org wrote:
> Maxim,
> In fact the .gitignore has "odp_shm". But i think it is because there 
> is a same name of it in /odp/test/api_test
> So , should i change a name of it and add it to the file ?
>

if it's already there than no need to add another one. Thanks for 
looking on it.

Maxim.

> ------------------------------------------------------------------------
> yan.songming@linaro.org
>
>     *From:* Maxim Uvarov <mailto:maxim.uvarov@linaro.org>
>     *Date:* 2014-11-24 17:22
>     *To:* yan.songming@linaro.org <mailto:yan.songming@linaro.org>;
>     lng-odp <mailto:lng-odp@lists.linaro.org>
>     *Subject:* Re: [lng-odp] [PATCH v2] cunit: add shm test
>     On 11/24/2014 08:46 AM, yan.songming@linaro.org wrote:
>     > Hi Maxim,
>     >
>     > You meaning i should update my .gitignore ?
>     > How do you know that ?
>     > I only know it is the rule to ignore some file or Directory in git.
>     >
>     Yes, if you add binary you need to include binary name to .gitignore.
>     Add changes to patch and send it.
>     .gitignore is not local file, it's regular git file.
>     Maxim.
>     > Thanks,
>     >
>     ------------------------------------------------------------------------
>     > yan.songming@linaro.org
>     >
>     >     *From:* Maxim Uvarov <mailto:maxim.uvarov@linaro.org>
>     >     *Date:* 2014-11-23 20:50
>     >     *To:* lng-odp <mailto:lng-odp@lists.linaro.org>
>     >     *Subject:* Re: [lng-odp] [PATCH v2] cunit: add shm test
>     >     you also need to update .gitignore.
>     >     Maxim.
>     >     On 11/21/2014 11:42 PM, Mike Holmes wrote:
>     >     > It looks like this needs to be revised to match the rules as
>     >     they have
>     >     > evolved this week.
>     >     >
>     >     > On 20 November 2014 09:54, Yan Songming
>     <yan.songming@linaro.org
>     >     > <mailto:yan.songming@linaro.org>> wrote:
>     >     >
>     >     >     Add odp_cunit_common.c for common cunit function and
>     add the
>     >     cunit
>     >     >     test for the api in odp_share_memory.h which include
>     the new api
>     >     >     implement
>     >     >     odp_shm_free.
>     >     >
>     >     >     Signed-off-by: Yan Songming <yan.songming@linaro.org
>     >     > <mailto:yan.songming@linaro.org>>
>     >     >     ---
>     >     >     v2 fix some problem which maxim and mike found.
>     >     >     ---
>     >     >      test/validation/Makefile.am        | 4 +-
>     >     >      test/validation/odp_cunit_common.c | 37 ++++++++++++
>     >     >      test/validation/odp_cunit_common.h | 41 +++++++++++++
>     >     >
>     >     >
>     >     > This breaks the rule that test/validation contain only the
>     main
>     >     entry
>     >     > point for the tests, if we like this file and think it can
>     contain
>     >     > multiple useful functions for unit testing I propose it
>     lives in
>     >     > test/validation/common
>     >     >
>     >     >      test/validation/odp_shm.c         | 121
>     >     >     +++++++++++++++++++++++++++++++++++++
>     >     >      4 files changed, 202 insertions(+), 1 deletion(-)
>     >     >      create mode 100644 test/validation/odp_cunit_common.c
>     >     >      create mode 100644 test/validation/odp_cunit_common.h
>     >     >      create mode 100644 test/validation/odp_shm.c
>     >     >
>     >     >     diff --git a/test/validation/Makefile.am
>     >     b/test/validation/Makefile.am
>     >     >     index 2e1b991..5992f72 100644
>     >     >     --- a/test/validation/Makefile.am
>     >     >     +++ b/test/validation/Makefile.am
>     >     >     @@ -6,11 +6,12 @@ AM_LDFLAGS += -L$(CUNIT_PATH)/lib
>     -static
>     >     -lcunit
>     >     >      if ODP_CUNIT_ENABLED
>     >     >      TESTS = ${bin_PROGRAMS}
>     >     >      check_PROGRAMS = ${bin_PROGRAMS}
>     >     >     -bin_PROGRAMS = odp_init odp_queue odp_crypto
>     >     >     +bin_PROGRAMS = odp_init odp_queue odp_crypto odp_shm
>     >     >      odp_init_LDFLAGS = $(AM_LDFLAGS)
>     >     >      odp_queue_LDFLAGS = $(AM_LDFLAGS)
>     >     >      odp_crypto_CFLAGS = $(AM_CFLAGS) -I./crypto
>     >     >      odp_crypto_LDFLAGS = $(AM_LDFLAGS)
>     >     >     +odp_shm_LDFLAGS = $(AM_LDFLAGS)
>     >     >      endif
>     >     >
>     >     >      dist_odp_init_SOURCES = odp_init.c
>     >     >     @@ -18,3 +19,4 @@ dist_odp_queue_SOURCES = odp_queue.c
>     >     >      dist_odp_crypto_SOURCES =
>     crypto/odp_crypto_test_async_inp.c \
>     >     >     crypto/odp_crypto_test_sync_inp.c \
>     >     >                               odp_crypto.c
>     >     >     +dist_odp_shm_SOURCES = odp_shm.c odp_cunit_common.c
>     >     >     diff --git a/test/validation/odp_cunit_common.c
>     >     >     b/test/validation/odp_cunit_common.c
>     >     >     new file mode 100644
>     >     >     index 0000000..885b981
>     >     >     --- /dev/null
>     >     >     +++ b/test/validation/odp_cunit_common.c
>     >     >     @@ -0,0 +1,37 @@
>     >     >     +/* Copyright (c) 2014, Linaro Limited
>     >     >     + * All rights reserved.
>     >     >     + *
>     >     >     + * SPDX-License-Identifier: BSD-3-Clause
>     >     >     + */
>     >     >     +
>     >     >     +/**
>     >     >     + * @file
>     >     >     + *
>     >     >     + * ODP test application common
>     >     >     + */
>     >     >     +
>     >     >     +#include <string.h>
>     >     >     +#include <odp.h>
>     >     >     +#include "odp_cunit_common.h"
>     >     >     +#include "odph_linux.h"
>     >     >     +/* Globals */
>     >     >     +static odph_linux_pthread_t thread_tbl[MAX_WORKERS];
>     >     >     +
>     >     >     +/** create test thread */
>     >     >     +int odp_cunit_thread_create(void *func_ptr(void *),
>     >     pthrd_arg *arg)
>     >     >     +{
>     >     >     +       /* Create and init additional threads */
>     >     >     + odph_linux_pthread_create(thread_tbl, arg->numthrds, 0,
>     >     >     func_ptr,
>     >     >     +                                 (void *)arg);
>     >     >     +
>     >     >     +       return 0;
>     >     >     +}
>     >     >     +
>     >     >     +/** exit from test thread */
>     >     >     +int odp_cunit_thread_exit(pthrd_arg *arg)
>     >     >     +{
>     >     >     +       /* Wait for other threads to exit */
>     >     >     + odph_linux_pthread_join(thread_tbl, arg->numthrds);
>     >     >     +
>     >     >     +       return 0;
>     >     >     +}
>     >     >     diff --git a/test/validation/odp_cunit_common.h
>     >     >     b/test/validation/odp_cunit_common.h
>     >     >     new file mode 100644
>     >     >     index 0000000..f6eb332
>     >     >     --- /dev/null
>     >     >     +++ b/test/validation/odp_cunit_common.h
>     >     >     @@ -0,0 +1,41 @@
>     >     >     +/* Copyright (c) 2014, Linaro Limited
>     >     >     + * All rights reserved.
>     >     >     + *
>     >     >     + * SPDX-License-Identifier: BSD-3-Clause
>     >     >     + */
>     >     >     +
>     >     >     +/**
>     >     >     + * @file
>     >     >     + *
>     >     >     + * ODP test application common headers
>     >     >     + */
>     >     >     +
>     >     >     +#ifndef ODP_CUNICT_COMMON_H
>     >     >     +#define ODP_CUNICT_COMMON_H
>     >     >     +
>     >     >     +#define MAX_WORKERS 32 /**< Maximum number of work
>     threads */
>     >     >     +
>     >     >     +typedef struct {
>     >     >     +       int foo;
>     >     >     +       int bar;
>     >     >     +} test_shared_data_t;
>     >     >     +
>     >     >     +/** types of tests */
>     >     >     +typedef enum {
>     >     >     +       ODP_SHM_TEST = 0,
>     >     >     +       ODP_MAX_TEST
>     >     >     +} odp_test_case_e;
>     >     >     +
>     >     >     +/**
>     >     >     + * Thread argument
>     >     >     + */
>     >     >     +typedef struct {
>     >     >     +       int testcase; /**< specifies which set of API's to
>     >     exercise */
>     >     >     +       int numthrds; /**< no of pthreads to create */
>     >     >     +} pthrd_arg;
>     >     >     +
>     >     >     +/** create thread fro start_routine function */
>     >     >     +extern int odp_cunit_thread_create(void
>     *func_ptr(void *),
>     >     >     pthrd_arg *arg);
>     >     >     +extern int odp_cunit_thread_exit(pthrd_arg *);
>     >     >     +
>     >     >     +#endif /* ODP_COMMON_H */
>     >     >     diff --git a/test/validation/odp_shm.c
>     >     b/test/validation/odp_shm.c
>     >     >     new file mode 100644
>     >     >     index 0000000..fea3620
>     >     >     --- /dev/null
>     >     >     +++ b/test/validation/odp_shm.c
>     >     >     @@ -0,0 +1,121 @@
>     >     >     +/* Copyright (c) 2014, Linaro Limited
>     >     >     + * All rights reserved.
>     >     >     + *
>     >     >     + * SPDX-License-Identifier: BSD-3-Clause
>     >     >     + */
>     >     >     +
>     >     >     +#include "odp.h"
>     >     >     +#include "CUnit/Basic.h"
>     >     >     +#include "odp_cunit_common.h"
>     >     >     +
>     >     >     +#define ALIGE_SIZE  (128)
>     >     >     +#define TESTNAME "cunit_test_shared_data"
>     >     >     +
>     >     >     +odp_shm_t shm;
>     >     >     +
>     >     >     +__thread test_shared_data_t *test_shared_data;
>     >     >     +static void *run_shm_thread(void *arg)
>     >     >     +{
>     >     >     +       pthrd_arg *parg = (pthrd_arg *)arg;
>     >     >     +       odp_shm_info_t  info;
>     >     >     +       int thr;
>     >     >     +
>     >     >     +       thr = odp_thread_id();
>     >     >     +
>     >     >     +       printf("Thread %i starts\n", thr);
>     >     >     +
>     >     >     +       switch (parg->testcase) {
>     >     >     +       case ODP_SHM_TEST:
>     >     >     +               shm = odp_shm_lookup(TESTNAME);
>     >     >     + CU_ASSERT(ODP_SHM_INVALID != shm);
>     >     >     +               test_shared_data = odp_shm_addr(shm);
>     >     >     +               CU_ASSERT(0 == odp_shm_info(shm, &info));
>     >     >     +               CU_ASSERT(0 == strcmp(TESTNAME, info.name
>     >     >     <http://info.name>));
>     >     >     +               CU_ASSERT(0 == info.flags);
>     >     >     + CU_ASSERT(test_shared_data == info.addr);
>     >     >     + CU_ASSERT(sizeof(test_shared_data_t) == info.size);
>     >     >     + CU_ASSERT(odp_sys_page_size() ==
>     >     info.page_size);
>     >     >     +               odp_shm_print_all();
>     >     >     +               break;
>     >     >     +       default:
>     >     >     +               printf("Invalid test case [%d]\n",
>     >     parg->testcase);
>     >     >     +       }
>     >     >     +       fflush(stdout);
>     >     >     +       return parg;
>     >     >     +}
>     >     >     +
>     >     >     +static void test_odp_shm_sunnyday(void)
>     >     >     +{
>     >     >     +       pthrd_arg thrdarg;
>     >     >     +
>     >     >     +       shm = odp_shm_reserve(TESTNAME,
>     >     >     + sizeof(test_shared_data_t),
>     >     >     ALIGE_SIZE, 0);
>     >     >     +       CU_ASSERT(ODP_SHM_INVALID != shm);
>     >     >     +
>     >     >     +       CU_ASSERT(0 == odp_shm_free(shm));
>     >     >     +       CU_ASSERT(ODP_SHM_INVALID ==
>     odp_shm_lookup(TESTNAME));
>     >     >     +
>     >     >     +       shm = odp_shm_reserve(TESTNAME,
>     >     >     + sizeof(test_shared_data_t),
>     >     >     ALIGE_SIZE, 0);
>     >     >     +       CU_ASSERT(ODP_SHM_INVALID != shm);
>     >     >     +
>     >     >     +       test_shared_data = odp_shm_addr(shm);
>     >     >     +       CU_ASSERT(NULL != test_shared_data);
>     >     >     +       memset(test_shared_data, 0,
>     sizeof(test_shared_data_t));
>     >     >     +
>     >     >     +       thrdarg.testcase = ODP_SHM_TEST;
>     >     >     +       thrdarg.numthrds = odp_sys_core_count();
>     >     >     +
>     >     >     +       if (thrdarg.numthrds > MAX_WORKERS)
>     >     >     +               thrdarg.numthrds = MAX_WORKERS;
>     >     >     +
>     >     >     + odp_cunit_thread_create(run_shm_thread, &thrdarg);
>     >     >     + odp_cunit_thread_exit(&thrdarg);
>     >     >     +}
>     >     >     +
>     >     >     +static int finalize(void)
>     >     >     +{
>     >     >     +       odp_term_local();
>     >     >     +       odp_term_global();
>     >     >     +       return 0;
>     >     >     +}
>     >     >     +
>     >     >     +static int init(void)
>     >     >     +{
>     >     >
>     >     >     +      if (0 != odp_init_global(NULL, NULL)) {
>     >     >     +               printf("odp_init_global fail.\n");
>     >     >     +               return -1;
>     >     >     +       }
>     >     >     +       if (0 != odp_init_local()) {
>     >     >     +               printf("odp_init_local fail.\n");
>     >     >     +               return -1;
>     >     >     +       }
>     >     >     +       return 0;
>     >     >     +}
>     >     >     +
>     >     >     +int main(void)
>     >     >     +{
>     >     >     +       CU_pSuite ptr_suite;
>     >     >     +
>     >     >     +       /* initialize the CUnit test registry */
>     >     >     +       if (CUE_SUCCESS != CU_initialize_registry())
>     >     >     +               return CU_get_error();
>     >     >
>     >     >     +
>     >     >     +       /* add the tests to the shm suite */
>     >     >     +       ptr_suite = CU_add_suite(__FILE__, init,
>     finalize);
>     >     >     +       if (!ptr_suite) {
>     >     >     +               CU_cleanup_registry();
>     >     >     +               return CU_get_error();
>     >     >     +       }
>     >     >
>     >     >
>     >     > This is a different style of test framework failure exit
>     to the one
>     >     > that Stuarts patch provided which returned -1 and we
>     should get all
>     >     > the tests working the same way,
>     >     >
>     >     > I wonder if we should use void
>     *CU_set_error_action*(CU_ErrorAction
>     >     > action) and set CUEA_ABORT which results in the
>     application calling
>     >     > exit() when an error occurs in the framework
>     >     > (but not in the asserts in the actual tests, they work as
>     before).
>     >     >
>     >     > This means we don't need to add checks to the return
>     codes  in the
>     >     > tests for the CU_* calls, we also no longer have to add and
>     >     prints to
>     >     > stderr to explain the situation making the test framework less
>     >     > intrusive in the test code.
>     >     > To test this I added this call to set the exit behavior
>     and then
>     >     > forced a framework error by passing null into AC_ADD_TEST and
>     >     got the
>     >     > following in the two run scenarios, and it works well I think
>     >     >
>     >     >
>     >     > $ make check
>     >     > ...
>     >     > make[4]: Entering directory
>     '/home/mike/git/odp/test/validation'
>     >     > FAIL: odp_init
>     >     > PASS: odp_queue
>     >     > PASS: odp_crypto
>     >     > make[5]: Entering directory
>     '/home/mike/git/odp/test/validation'
>     >     > make[5]: Nothing to be done for 'all'.
>     >     > make[5]: Leaving directory
>     '/home/mike/git/odp/test/validation'
>     >     >
>     >
>     ============================================================================
>     >     > Testsuite summary for OpenDataPlane 0.3.0
>     >     >
>     >
>     ============================================================================
>     >     > # TOTAL: 3
>     >     > # PASS:  2
>     >     > # SKIP:  0
>     >     > # XFAIL: 0
>     >     > # FAIL:  1
>     >     > # XPASS: 0
>     >     > # ERROR: 0
>     >     >
>     >
>     ============================================================================
>     >     > See test/validation/test-suite.log
>     >     > Please report to lng-odp@lists.linaro.org
>     >     > <mailto:lng-odp@lists.linaro.org>
>     >     >
>     >
>     ============================================================================
>     >     >
>     >     > And it looks like this when called directly
>     >     >
>     >     > $ test/validation/odp_init
>     >     > Aborting due to error #20: NULL suite not allowed.
>     >     >
>     >     >
>     >     >
>     >     >
>     >     >     +
>     >     >     +       if (NULL == CU_ADD_TEST(ptr_suite,
>     >     test_odp_shm_sunnyday)) {
>     >     >     +               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();
>     >     >     +       CU_cleanup_registry();
>     >     >     +       return CU_get_error();
>     >     >
>     >     >
>     >     >
>     >     >
>     >     >
>     >     >     +}
>     >     >     --
>     >     >     1.8.3.1
>     >     >
>     >     >
>     >     > _______________________________________________
>     >     >     lng-odp mailing list
>     >     >     lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>
>     >     > http://lists.linaro.org/mailman/listinfo/lng-odp
>     >     >
>     >     >
>     >     >
>     >     >
>     >     > --
>     >     > *Mike Holmes*
>     >     > Linaro  Sr Technical Manager
>     >     > LNG - ODP
>     >     >
>     >     >
>     >     > _______________________________________________
>     >     > lng-odp mailing list
>     >     > lng-odp@lists.linaro.org
>     >     > http://lists.linaro.org/mailman/listinfo/lng-odp
>     >     _______________________________________________
>     >     lng-odp mailing list
>     >     lng-odp@lists.linaro.org
>     >     http://lists.linaro.org/mailman/listinfo/lng-odp
>     >
>
diff mbox

Patch

diff --git a/test/validation/Makefile.am b/test/validation/Makefile.am
index 2e1b991..5992f72 100644
--- a/test/validation/Makefile.am
+++ b/test/validation/Makefile.am
@@ -6,11 +6,12 @@  AM_LDFLAGS += -L$(CUNIT_PATH)/lib -static -lcunit
 if ODP_CUNIT_ENABLED
 TESTS = ${bin_PROGRAMS}
 check_PROGRAMS = ${bin_PROGRAMS}
-bin_PROGRAMS = odp_init odp_queue odp_crypto
+bin_PROGRAMS = odp_init odp_queue odp_crypto odp_shm
 odp_init_LDFLAGS = $(AM_LDFLAGS)
 odp_queue_LDFLAGS = $(AM_LDFLAGS)
 odp_crypto_CFLAGS = $(AM_CFLAGS) -I./crypto
 odp_crypto_LDFLAGS = $(AM_LDFLAGS)
+odp_shm_LDFLAGS = $(AM_LDFLAGS)
 endif
 
 dist_odp_init_SOURCES = odp_init.c
@@ -18,3 +19,4 @@  dist_odp_queue_SOURCES = odp_queue.c
 dist_odp_crypto_SOURCES = crypto/odp_crypto_test_async_inp.c \
 			  crypto/odp_crypto_test_sync_inp.c \
 			  odp_crypto.c
+dist_odp_shm_SOURCES = odp_shm.c odp_cunit_common.c
diff --git a/test/validation/odp_cunit_common.c b/test/validation/odp_cunit_common.c
new file mode 100644
index 0000000..885b981
--- /dev/null
+++ b/test/validation/odp_cunit_common.c
@@ -0,0 +1,37 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * ODP test application common
+ */
+
+#include <string.h>
+#include <odp.h>
+#include "odp_cunit_common.h"
+#include "odph_linux.h"
+/* Globals */
+static odph_linux_pthread_t thread_tbl[MAX_WORKERS];
+
+/** create test thread */
+int odp_cunit_thread_create(void *func_ptr(void *), pthrd_arg *arg)
+{
+	/* Create and init additional threads */
+	odph_linux_pthread_create(thread_tbl, arg->numthrds, 0, func_ptr,
+				  (void *)arg);
+
+	return 0;
+}
+
+/** exit from test thread */
+int odp_cunit_thread_exit(pthrd_arg *arg)
+{
+	/* Wait for other threads to exit */
+	odph_linux_pthread_join(thread_tbl, arg->numthrds);
+
+	return 0;
+}
diff --git a/test/validation/odp_cunit_common.h b/test/validation/odp_cunit_common.h
new file mode 100644
index 0000000..f6eb332
--- /dev/null
+++ b/test/validation/odp_cunit_common.h
@@ -0,0 +1,41 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * ODP test application common headers
+ */
+
+#ifndef ODP_CUNICT_COMMON_H
+#define ODP_CUNICT_COMMON_H
+
+#define MAX_WORKERS 32 /**< Maximum number of work threads */
+
+typedef struct {
+	int foo;
+	int bar;
+} test_shared_data_t;
+
+/** types of tests */
+typedef enum {
+	ODP_SHM_TEST = 0,
+	ODP_MAX_TEST
+} odp_test_case_e;
+
+/**
+ * Thread argument
+ */
+typedef struct {
+	int testcase; /**< specifies which set of API's to exercise */
+	int numthrds; /**< no of pthreads to create */
+} pthrd_arg;
+
+/** create thread fro start_routine function */
+extern int odp_cunit_thread_create(void *func_ptr(void *), pthrd_arg *arg);
+extern int odp_cunit_thread_exit(pthrd_arg *);
+
+#endif /* ODP_COMMON_H */
diff --git a/test/validation/odp_shm.c b/test/validation/odp_shm.c
new file mode 100644
index 0000000..fea3620
--- /dev/null
+++ b/test/validation/odp_shm.c
@@ -0,0 +1,121 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include "odp.h"
+#include "CUnit/Basic.h"
+#include "odp_cunit_common.h"
+
+#define ALIGE_SIZE  (128)
+#define TESTNAME "cunit_test_shared_data"
+
+odp_shm_t shm;
+
+__thread test_shared_data_t *test_shared_data;
+static void *run_shm_thread(void *arg)
+{
+	pthrd_arg *parg = (pthrd_arg *)arg;
+	odp_shm_info_t  info;
+	int thr;
+
+	thr = odp_thread_id();
+
+	printf("Thread %i starts\n", thr);
+
+	switch (parg->testcase) {
+	case ODP_SHM_TEST:
+		shm = odp_shm_lookup(TESTNAME);
+		CU_ASSERT(ODP_SHM_INVALID != shm);
+		test_shared_data = odp_shm_addr(shm);
+		CU_ASSERT(0 == odp_shm_info(shm, &info));
+		CU_ASSERT(0 == strcmp(TESTNAME, info.name));
+		CU_ASSERT(0 == info.flags);
+		CU_ASSERT(test_shared_data == info.addr);
+		CU_ASSERT(sizeof(test_shared_data_t) == info.size);
+		CU_ASSERT(odp_sys_page_size() == info.page_size);
+		odp_shm_print_all();
+		break;
+	default:
+		printf("Invalid test case [%d]\n", parg->testcase);
+	}
+	fflush(stdout);
+	return parg;
+}
+
+static void test_odp_shm_sunnyday(void)
+{
+	pthrd_arg thrdarg;
+
+	shm = odp_shm_reserve(TESTNAME,
+			      sizeof(test_shared_data_t), ALIGE_SIZE, 0);
+	CU_ASSERT(ODP_SHM_INVALID != shm);
+
+	CU_ASSERT(0 == odp_shm_free(shm));
+	CU_ASSERT(ODP_SHM_INVALID == odp_shm_lookup(TESTNAME));
+
+	shm = odp_shm_reserve(TESTNAME,
+			      sizeof(test_shared_data_t), ALIGE_SIZE, 0);
+	CU_ASSERT(ODP_SHM_INVALID != shm);
+
+	test_shared_data = odp_shm_addr(shm);
+	CU_ASSERT(NULL != test_shared_data);
+	memset(test_shared_data, 0, sizeof(test_shared_data_t));
+
+	thrdarg.testcase = ODP_SHM_TEST;
+	thrdarg.numthrds = odp_sys_core_count();
+
+	if (thrdarg.numthrds > MAX_WORKERS)
+		thrdarg.numthrds = MAX_WORKERS;
+
+	odp_cunit_thread_create(run_shm_thread, &thrdarg);
+	odp_cunit_thread_exit(&thrdarg);
+}
+
+static int finalize(void)
+{
+	odp_term_local();
+	odp_term_global();
+	return 0;
+}
+
+static int init(void)
+{
+	if (0 != odp_init_global(NULL, NULL)) {
+		printf("odp_init_global fail.\n");
+		return -1;
+	}
+	if (0 != odp_init_local()) {
+		printf("odp_init_local fail.\n");
+		return -1;
+	}
+	return 0;
+}
+
+int main(void)
+{
+	CU_pSuite ptr_suite;
+
+	/* initialize the CUnit test registry */
+	if (CUE_SUCCESS != CU_initialize_registry())
+		return CU_get_error();
+
+	/* add the tests to the shm suite */
+	ptr_suite = CU_add_suite(__FILE__, init, finalize);
+	if (!ptr_suite) {
+		CU_cleanup_registry();
+		return CU_get_error();
+	}
+
+	if (NULL == CU_ADD_TEST(ptr_suite, test_odp_shm_sunnyday)) {
+		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();
+	CU_cleanup_registry();
+	return CU_get_error();
+}