diff mbox

test: helper: add process and thread tests

Message ID 1429648005-32618-1-git-send-email-mike.holmes@linaro.org
State Superseded
Headers show

Commit Message

Mike Holmes April 21, 2015, 8:26 p.m. UTC
The helpers need to be tested independently from the ODP API, create a
folder to contain helper tests, adding tests for process and thread
creation.

Signed-off-by: Mike Holmes <mike.holmes@linaro.org>
---
 configure.ac              | 15 +++++++++
 test/Makefile.am          |  5 ++-
 test/helper/.gitignore    |  4 +++
 test/helper/Makefile.am   | 25 ++++++++++++++
 test/helper/odp_process.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++
 test/helper/odp_thread.c  | 79 +++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 212 insertions(+), 1 deletion(-)
 create mode 100644 test/helper/.gitignore
 create mode 100644 test/helper/Makefile.am
 create mode 100644 test/helper/odp_process.c
 create mode 100644 test/helper/odp_thread.c

Comments

Anders Roxell April 27, 2015, 7:22 p.m. UTC | #1
On 2015-04-21 16:26, Mike Holmes wrote:
> The helpers need to be tested independently from the ODP API, create a
> folder to contain helper tests, adding tests for process and thread
> creation.
> 
> Signed-off-by: Mike Holmes <mike.holmes@linaro.org>
> ---
>  configure.ac              | 15 +++++++++
>  test/Makefile.am          |  5 ++-
>  test/helper/.gitignore    |  4 +++
>  test/helper/Makefile.am   | 25 ++++++++++++++
>  test/helper/odp_process.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++
>  test/helper/odp_thread.c  | 79 +++++++++++++++++++++++++++++++++++++++++++

I think we should put helper tests in helper/test.
It will be easier to rip helper out to its own repo in the future.

Cheers,
Anders

>  6 files changed, 212 insertions(+), 1 deletion(-)
>  create mode 100644 test/helper/.gitignore
>  create mode 100644 test/helper/Makefile.am
>  create mode 100644 test/helper/odp_process.c
>  create mode 100644 test/helper/odp_thread.c
> 
> diff --git a/configure.ac b/configure.ac
> index 78ff245..c03778f 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -138,6 +138,20 @@ AC_ARG_ENABLE([test-perf],
>  AM_CONDITIONAL([test_perf], [test x$test_perf = xyes ])
>  
>  ##########################################################################
> +# Enable/disable test-helper
> +##########################################################################
> +test_helper=no
> +AC_ARG_ENABLE([test-helper],
> +    [  --enable-test-helper      run test in test/helper],
> +    [if test "x$enableval" = "xyes"; then
> +        test_helper=yes
> +    fi])
> +
> +AM_CONDITIONAL([test_helper], [test x$test_helper = xyes ])
> +
> +##########################################################################
> +
> +##########################################################################
>  # Enable/disable test-cpp
>  ##########################################################################
>  test_cpp=no
> @@ -284,6 +298,7 @@ AC_CONFIG_FILES([Makefile
>  		 test/performance/Makefile
>  		 test/validation/Makefile
>  		 test/miscellaneous/Makefile
> +		 test/helper/Makefile
>  		 ])
>  
>  AC_SEARCH_LIBS([timer_create],[rt posix4])
> diff --git a/test/Makefile.am b/test/Makefile.am
> index 2ba8008..31872b0 100644
> --- a/test/Makefile.am
> +++ b/test/Makefile.am
> @@ -1,4 +1,7 @@
> -SUBDIRS = api_test performance miscellaneous
> +SUBDIRS = api_test \
> +          performance \
> +          miscellaneous \
> +          helper
>  
>  if cunit_support
>      SUBDIRS += validation
> diff --git a/test/helper/.gitignore b/test/helper/.gitignore
> new file mode 100644
> index 0000000..fe65f30
> --- /dev/null
> +++ b/test/helper/.gitignore
> @@ -0,0 +1,4 @@
> +*.trs
> +*.log
> +odp_process
> +odp_thread
> diff --git a/test/helper/Makefile.am b/test/helper/Makefile.am
> new file mode 100644
> index 0000000..f330533
> --- /dev/null
> +++ b/test/helper/Makefile.am
> @@ -0,0 +1,25 @@
> +include $(top_srcdir)/test/Makefile.inc
> +
> +AM_CFLAGS += -I$(srcdir)/common
> +AM_LDFLAGS += -static
> +
> +TESTS_ENVIRONMENT = ODP_PLATFORM=${with_platform} TEST_DIR=${builddir}
> +
> +EXECUTABLES = odp_thread \
> +              odp_process
> +
> +COMPILE_ONLY =
> +
> +TESTSCRIPTS =
> +
> +if test_helper
> +TESTS = $(EXECUTABLES) $(TESTSCRIPTS)
> +endif
> +
> +dist_bin_SCRIPTS =
> +
> +bin_PROGRAMS = $(EXECUTABLES) $(COMPILE_ONLY)
> +
> +
> +dist_odp_thread_SOURCES = odp_thread.c
> +dist_odp_process_SOURCES = odp_process.c
> diff --git a/test/helper/odp_process.c b/test/helper/odp_process.c
> new file mode 100644
> index 0000000..495cb00
> --- /dev/null
> +++ b/test/helper/odp_process.c
> @@ -0,0 +1,85 @@
> +/* Copyright (c) 2015, Linaro Limited
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier:     BSD-3-Clause
> + */
> +
> +#include <test_debug.h>
> +#include <odp.h>
> +#include <odp/helper/linux.h>
> +
> +#define NUMBER_WORKERS 16 /* 0 = max */
> +
> +static void *worker_fn(void *arg TEST_UNUSED)
> +{
> +	/* depend on the odp helper to call odp_init_local */
> +	printf("Worker thread on CPU %d\n", odp_cpu_id());
> +
> +	return 0;
> +}
> +
> +/* Create additional dataplane processes */
> +int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
> +{
> +	odp_cpumask_t cpu_mask;
> +	int num_workers;
> +	int cpu;
> +	char cpumaskstr[ODP_CPUMASK_STR_SIZE];
> +	int ret;
> +	odph_linux_process_t proc[NUMBER_WORKERS];
> +
> +	if (odp_init_global(NULL, NULL)) {
> +		LOG_ERR("Error: ODP global init failed.\n");
> +		exit(EXIT_FAILURE);
> +	}
> +
> +	if (odp_init_local()) {
> +		LOG_ERR("Error: ODP local init failed.\n");
> +		exit(EXIT_FAILURE);
> +	}
> +
> +	/* discover how many threads this system can support */
> +	num_workers = odph_linux_cpumask_default(&cpu_mask, NUMBER_WORKERS);
> +	if (num_workers < NUMBER_WORKERS) {
> +		printf("System can only support %d threads and not the %d requested\n",
> +		       num_workers, NUMBER_WORKERS);
> +	}
> +
> +	/* generate a summary for the user */
> +	(void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr));
> +	printf("default cpu mask:           %s\n", cpumaskstr);
> +	printf("default num worker threads: %i\n", num_workers);
> +
> +	cpu = odp_cpumask_first(&cpu_mask);
> +	printf("the first CPU:              %i\n", cpu);
> +
> +	/* reserve cpu 0 for the control plane so remove it from the default mask */
> +	odp_cpumask_clr(&cpu_mask, 0);
> +	num_workers = odp_cpumask_count(&cpu_mask);
> +	(void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr));
> +	printf("new cpu mask:               %s\n", cpumaskstr);
> +	printf("new num worker threads:     %i\n\n", num_workers);
> +
> +	/* Fork worker processes */
> +	ret = odph_linux_process_fork_n(proc, &cpu_mask);
> +
> +	if (ret < 0) {
> +		LOG_ERR("Fork workers failed %i\n", ret);
> +		return -1;
> +	}
> +
> +	if (ret == 0) {
> +		/* Child process */
> +		worker_fn(NULL);
> +	} else {
> +		/* Parent process */
> +		odph_linux_process_wait_n(proc, num_workers);
> +
> +		if (odp_term_global()) {
> +			LOG_ERR("Error: ODP global term failed.\n");
> +			exit(EXIT_FAILURE);
> +		}
> +	}
> +
> +	return 0;
> +}
> diff --git a/test/helper/odp_thread.c b/test/helper/odp_thread.c
> new file mode 100644
> index 0000000..04c6b1e
> --- /dev/null
> +++ b/test/helper/odp_thread.c
> @@ -0,0 +1,79 @@
> +/* Copyright (c) 2015, Linaro Limited
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier:     BSD-3-Clause
> + */
> +
> +#include <test_debug.h>
> +#include <odp.h>
> +#include <odp/helper/linux.h>
> +
> +#define NUMBER_WORKERS 16
> +static void *worker_fn(void *arg TEST_UNUSED)
> +{
> +	/* depend on the odp helper to call odp_init_local */
> +
> +	printf("Worker thread on CPU %d\n", odp_cpu_id());
> +
> +	/* depend on the odp helper to call odp_term_local */
> +
> +	return 0;
> +}
> +
> +/* Create additional dataplane threads */
> +int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
> +{
> +	odph_linux_pthread_t thread_tbl[NUMBER_WORKERS];
> +	odp_cpumask_t cpu_mask;
> +	int num_workers;
> +	int cpu;
> +	char cpumaskstr[ODP_CPUMASK_STR_SIZE];
> +
> +	if (odp_init_global(NULL, NULL)) {
> +		LOG_ERR("Error: ODP global init failed.\n");
> +		exit(EXIT_FAILURE);
> +	}
> +
> +	if (odp_init_local()) {
> +		LOG_ERR("Error: ODP local init failed.\n");
> +		exit(EXIT_FAILURE);
> +	}
> +
> +	/* discover how many threads this system can support */
> +	num_workers = odph_linux_cpumask_default(&cpu_mask, NUMBER_WORKERS);
> +	if (num_workers < NUMBER_WORKERS) {
> +		printf("System can only support %d threads and not the %d requested\n",
> +		       num_workers, NUMBER_WORKERS);
> +	}
> +
> +	/* generate a summary for the user */
> +	(void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr));
> +	printf("default cpu mask:           %s\n", cpumaskstr);
> +	printf("default num worker threads: %i\n", num_workers);
> +
> +	cpu = odp_cpumask_first(&cpu_mask);
> +	printf("the first CPU:              %i\n", cpu);
> +
> +	/* reserve cpu 0 for the control plane so remove it from the default mask */
> +	odp_cpumask_clr(&cpu_mask, 0);
> +	num_workers = odp_cpumask_count(&cpu_mask);
> +	(void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr));
> +	printf("new cpu mask:               %s\n", cpumaskstr);
> +	printf("new num worker threads:     %i\n\n", num_workers);
> +
> +	odph_linux_pthread_create(&thread_tbl[0], &cpu_mask, worker_fn, NULL);
> +
> +	odph_linux_pthread_join(thread_tbl, num_workers);
> +
> +	if (odp_term_local()) {
> +		LOG_ERR("Error: ODP local term failed.\n");
> +		exit(EXIT_FAILURE);
> +	}
> +
> +	if (odp_term_global()) {
> +		LOG_ERR("Error: ODP global term failed.\n");
> +		exit(EXIT_FAILURE);
> +	}
> +
> +	return 0;
> +}
> -- 
> 2.1.0
> 
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> https://lists.linaro.org/mailman/listinfo/lng-odp
Maxim Uvarov April 28, 2015, 9:49 a.m. UTC | #2
On 04/27/2015 22:22, Anders Roxell wrote:
> On 2015-04-21 16:26, Mike Holmes wrote:
>> The helpers need to be tested independently from the ODP API, create a
>> folder to contain helper tests, adding tests for process and thread
>> creation.
>>
>> Signed-off-by: Mike Holmes <mike.holmes@linaro.org>
>> ---
>>   configure.ac              | 15 +++++++++
>>   test/Makefile.am          |  5 ++-
>>   test/helper/.gitignore    |  4 +++
>>   test/helper/Makefile.am   | 25 ++++++++++++++
>>   test/helper/odp_process.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++
>>   test/helper/odp_thread.c  | 79 +++++++++++++++++++++++++++++++++++++++++++
> I think we should put helper tests in helper/test.
> It will be easier to rip helper out to its own repo in the future.
>
> Cheers,
> Anders
No, tests should be in some common place. We had a lot of discussions 
for that before.
No need to rip out to own repo helpers.

Thanks,
Maxim.


>>   6 files changed, 212 insertions(+), 1 deletion(-)
>>   create mode 100644 test/helper/.gitignore
>>   create mode 100644 test/helper/Makefile.am
>>   create mode 100644 test/helper/odp_process.c
>>   create mode 100644 test/helper/odp_thread.c
>>
>> diff --git a/configure.ac b/configure.ac
>> index 78ff245..c03778f 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -138,6 +138,20 @@ AC_ARG_ENABLE([test-perf],
>>   AM_CONDITIONAL([test_perf], [test x$test_perf = xyes ])
>>   
>>   ##########################################################################
>> +# Enable/disable test-helper
>> +##########################################################################
>> +test_helper=no
>> +AC_ARG_ENABLE([test-helper],
>> +    [  --enable-test-helper      run test in test/helper],
>> +    [if test "x$enableval" = "xyes"; then
>> +        test_helper=yes
>> +    fi])
>> +
>> +AM_CONDITIONAL([test_helper], [test x$test_helper = xyes ])
>> +
>> +##########################################################################
>> +
>> +##########################################################################
>>   # Enable/disable test-cpp
>>   ##########################################################################
>>   test_cpp=no
>> @@ -284,6 +298,7 @@ AC_CONFIG_FILES([Makefile
>>   		 test/performance/Makefile
>>   		 test/validation/Makefile
>>   		 test/miscellaneous/Makefile
>> +		 test/helper/Makefile
>>   		 ])
>>   
>>   AC_SEARCH_LIBS([timer_create],[rt posix4])
>> diff --git a/test/Makefile.am b/test/Makefile.am
>> index 2ba8008..31872b0 100644
>> --- a/test/Makefile.am
>> +++ b/test/Makefile.am
>> @@ -1,4 +1,7 @@
>> -SUBDIRS = api_test performance miscellaneous
>> +SUBDIRS = api_test \
>> +          performance \
>> +          miscellaneous \
>> +          helper
>>   
>>   if cunit_support
>>       SUBDIRS += validation
>> diff --git a/test/helper/.gitignore b/test/helper/.gitignore
>> new file mode 100644
>> index 0000000..fe65f30
>> --- /dev/null
>> +++ b/test/helper/.gitignore
>> @@ -0,0 +1,4 @@
>> +*.trs
>> +*.log
>> +odp_process
>> +odp_thread
>> diff --git a/test/helper/Makefile.am b/test/helper/Makefile.am
>> new file mode 100644
>> index 0000000..f330533
>> --- /dev/null
>> +++ b/test/helper/Makefile.am
>> @@ -0,0 +1,25 @@
>> +include $(top_srcdir)/test/Makefile.inc
>> +
>> +AM_CFLAGS += -I$(srcdir)/common
>> +AM_LDFLAGS += -static
>> +
>> +TESTS_ENVIRONMENT = ODP_PLATFORM=${with_platform} TEST_DIR=${builddir}
>> +
>> +EXECUTABLES = odp_thread \
>> +              odp_process
>> +
>> +COMPILE_ONLY =
>> +
>> +TESTSCRIPTS =
>> +
>> +if test_helper
>> +TESTS = $(EXECUTABLES) $(TESTSCRIPTS)
>> +endif
>> +
>> +dist_bin_SCRIPTS =
>> +
>> +bin_PROGRAMS = $(EXECUTABLES) $(COMPILE_ONLY)
>> +
>> +
>> +dist_odp_thread_SOURCES = odp_thread.c
>> +dist_odp_process_SOURCES = odp_process.c
>> diff --git a/test/helper/odp_process.c b/test/helper/odp_process.c
>> new file mode 100644
>> index 0000000..495cb00
>> --- /dev/null
>> +++ b/test/helper/odp_process.c
>> @@ -0,0 +1,85 @@
>> +/* Copyright (c) 2015, Linaro Limited
>> + * All rights reserved.
>> + *
>> + * SPDX-License-Identifier:     BSD-3-Clause
>> + */
>> +
>> +#include <test_debug.h>
>> +#include <odp.h>
>> +#include <odp/helper/linux.h>
>> +
>> +#define NUMBER_WORKERS 16 /* 0 = max */
>> +
>> +static void *worker_fn(void *arg TEST_UNUSED)
>> +{
>> +	/* depend on the odp helper to call odp_init_local */
>> +	printf("Worker thread on CPU %d\n", odp_cpu_id());
>> +
>> +	return 0;
>> +}
>> +
>> +/* Create additional dataplane processes */
>> +int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
>> +{
>> +	odp_cpumask_t cpu_mask;
>> +	int num_workers;
>> +	int cpu;
>> +	char cpumaskstr[ODP_CPUMASK_STR_SIZE];
>> +	int ret;
>> +	odph_linux_process_t proc[NUMBER_WORKERS];
>> +
>> +	if (odp_init_global(NULL, NULL)) {
>> +		LOG_ERR("Error: ODP global init failed.\n");
>> +		exit(EXIT_FAILURE);
>> +	}
>> +
>> +	if (odp_init_local()) {
>> +		LOG_ERR("Error: ODP local init failed.\n");
>> +		exit(EXIT_FAILURE);
>> +	}
>> +
>> +	/* discover how many threads this system can support */
>> +	num_workers = odph_linux_cpumask_default(&cpu_mask, NUMBER_WORKERS);
>> +	if (num_workers < NUMBER_WORKERS) {
>> +		printf("System can only support %d threads and not the %d requested\n",
>> +		       num_workers, NUMBER_WORKERS);
>> +	}
>> +
>> +	/* generate a summary for the user */
>> +	(void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr));
>> +	printf("default cpu mask:           %s\n", cpumaskstr);
>> +	printf("default num worker threads: %i\n", num_workers);
>> +
>> +	cpu = odp_cpumask_first(&cpu_mask);
>> +	printf("the first CPU:              %i\n", cpu);
>> +
>> +	/* reserve cpu 0 for the control plane so remove it from the default mask */
>> +	odp_cpumask_clr(&cpu_mask, 0);
>> +	num_workers = odp_cpumask_count(&cpu_mask);
>> +	(void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr));
>> +	printf("new cpu mask:               %s\n", cpumaskstr);
>> +	printf("new num worker threads:     %i\n\n", num_workers);
>> +
>> +	/* Fork worker processes */
>> +	ret = odph_linux_process_fork_n(proc, &cpu_mask);
>> +
>> +	if (ret < 0) {
>> +		LOG_ERR("Fork workers failed %i\n", ret);
>> +		return -1;
>> +	}
>> +
>> +	if (ret == 0) {
>> +		/* Child process */
>> +		worker_fn(NULL);
>> +	} else {
>> +		/* Parent process */
>> +		odph_linux_process_wait_n(proc, num_workers);
>> +
>> +		if (odp_term_global()) {
>> +			LOG_ERR("Error: ODP global term failed.\n");
>> +			exit(EXIT_FAILURE);
>> +		}
>> +	}
>> +
>> +	return 0;
>> +}
>> diff --git a/test/helper/odp_thread.c b/test/helper/odp_thread.c
>> new file mode 100644
>> index 0000000..04c6b1e
>> --- /dev/null
>> +++ b/test/helper/odp_thread.c
>> @@ -0,0 +1,79 @@
>> +/* Copyright (c) 2015, Linaro Limited
>> + * All rights reserved.
>> + *
>> + * SPDX-License-Identifier:     BSD-3-Clause
>> + */
>> +
>> +#include <test_debug.h>
>> +#include <odp.h>
>> +#include <odp/helper/linux.h>
>> +
>> +#define NUMBER_WORKERS 16
>> +static void *worker_fn(void *arg TEST_UNUSED)
>> +{
>> +	/* depend on the odp helper to call odp_init_local */
>> +
>> +	printf("Worker thread on CPU %d\n", odp_cpu_id());
>> +
>> +	/* depend on the odp helper to call odp_term_local */
>> +
>> +	return 0;
>> +}
>> +
>> +/* Create additional dataplane threads */
>> +int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
>> +{
>> +	odph_linux_pthread_t thread_tbl[NUMBER_WORKERS];
>> +	odp_cpumask_t cpu_mask;
>> +	int num_workers;
>> +	int cpu;
>> +	char cpumaskstr[ODP_CPUMASK_STR_SIZE];
>> +
>> +	if (odp_init_global(NULL, NULL)) {
>> +		LOG_ERR("Error: ODP global init failed.\n");
>> +		exit(EXIT_FAILURE);
>> +	}
>> +
>> +	if (odp_init_local()) {
>> +		LOG_ERR("Error: ODP local init failed.\n");
>> +		exit(EXIT_FAILURE);
>> +	}
>> +
>> +	/* discover how many threads this system can support */
>> +	num_workers = odph_linux_cpumask_default(&cpu_mask, NUMBER_WORKERS);
>> +	if (num_workers < NUMBER_WORKERS) {
>> +		printf("System can only support %d threads and not the %d requested\n",
>> +		       num_workers, NUMBER_WORKERS);
>> +	}
>> +
>> +	/* generate a summary for the user */
>> +	(void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr));
>> +	printf("default cpu mask:           %s\n", cpumaskstr);
>> +	printf("default num worker threads: %i\n", num_workers);
>> +
>> +	cpu = odp_cpumask_first(&cpu_mask);
>> +	printf("the first CPU:              %i\n", cpu);
>> +
>> +	/* reserve cpu 0 for the control plane so remove it from the default mask */
>> +	odp_cpumask_clr(&cpu_mask, 0);
>> +	num_workers = odp_cpumask_count(&cpu_mask);
>> +	(void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr));
>> +	printf("new cpu mask:               %s\n", cpumaskstr);
>> +	printf("new num worker threads:     %i\n\n", num_workers);
>> +
>> +	odph_linux_pthread_create(&thread_tbl[0], &cpu_mask, worker_fn, NULL);
>> +
>> +	odph_linux_pthread_join(thread_tbl, num_workers);
>> +
>> +	if (odp_term_local()) {
>> +		LOG_ERR("Error: ODP local term failed.\n");
>> +		exit(EXIT_FAILURE);
>> +	}
>> +
>> +	if (odp_term_global()) {
>> +		LOG_ERR("Error: ODP global term failed.\n");
>> +		exit(EXIT_FAILURE);
>> +	}
>> +
>> +	return 0;
>> +}
>> -- 
>> 2.1.0
>>
>> _______________________________________________
>> lng-odp mailing list
>> lng-odp@lists.linaro.org
>> https://lists.linaro.org/mailman/listinfo/lng-odp
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> https://lists.linaro.org/mailman/listinfo/lng-odp
Stuart Haslam April 28, 2015, 12:55 p.m. UTC | #3
On Tue, Apr 28, 2015 at 12:49:48PM +0300, Maxim Uvarov wrote:
> On 04/27/2015 22:22, Anders Roxell wrote:
> >On 2015-04-21 16:26, Mike Holmes wrote:
> >>The helpers need to be tested independently from the ODP API, create a
> >>folder to contain helper tests, adding tests for process and thread
> >>creation.
> >>
> >>Signed-off-by: Mike Holmes <mike.holmes@linaro.org>
> >>---
> >>  configure.ac              | 15 +++++++++
> >>  test/Makefile.am          |  5 ++-
> >>  test/helper/.gitignore    |  4 +++
> >>  test/helper/Makefile.am   | 25 ++++++++++++++
> >>  test/helper/odp_process.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++
> >>  test/helper/odp_thread.c  | 79 +++++++++++++++++++++++++++++++++++++++++++
> >I think we should put helper tests in helper/test.
> >It will be easier to rip helper out to its own repo in the future.
> >
> >Cheers,
> >Anders
> No, tests should be in some common place. We had a lot of
> discussions for that before.
> No need to rip out to own repo helpers.
> 
> Thanks,
> Maxim.
> 

I also think that helper/test is a better location for these tests as it
maintains a clearer separation of the helpers from the ODP API, which is
good given it's already a bit confusing. So we'd have;

test/                     -> ODP API tests
helper/test/              -> helper tests

And maybe later..

platform/<platform>/test/ -> platform specific tests
Mike Holmes April 28, 2015, 4:25 p.m. UTC | #4
On 28 April 2015 at 08:55, Stuart Haslam <stuart.haslam@linaro.org> wrote:

> On Tue, Apr 28, 2015 at 12:49:48PM +0300, Maxim Uvarov wrote:
> > On 04/27/2015 22:22, Anders Roxell wrote:
> > >On 2015-04-21 16:26, Mike Holmes wrote:
> > >>The helpers need to be tested independently from the ODP API, create a
> > >>folder to contain helper tests, adding tests for process and thread
> > >>creation.
> > >>
> > >>Signed-off-by: Mike Holmes <mike.holmes@linaro.org>
> > >>---
> > >>  configure.ac              | 15 +++++++++
> > >>  test/Makefile.am          |  5 ++-
> > >>  test/helper/.gitignore    |  4 +++
> > >>  test/helper/Makefile.am   | 25 ++++++++++++++
> > >>  test/helper/odp_process.c | 85
> +++++++++++++++++++++++++++++++++++++++++++++++
> > >>  test/helper/odp_thread.c  | 79
> +++++++++++++++++++++++++++++++++++++++++++
> > >I think we should put helper tests in helper/test.
> > >It will be easier to rip helper out to its own repo in the future.
> > >
> > >Cheers,
> > >Anders
> > No, tests should be in some common place. We had a lot of
> > discussions for that before.
> > No need to rip out to own repo helpers.
> >
> > Thanks,
> > Maxim.
> >
>
> I also think that helper/test is a better location for these tests as it
> maintains a clearer separation of the helpers from the ODP API, which is
> good given it's already a bit confusing. So we'd have;
>
> test/                     -> ODP API tests
> helper/test/              -> helper tests
>
> And maybe later..
>
> platform/<platform>/test/ -> platform specific tests
>

We need this already to test things like replacing the abort function with
global init, it needs to provoke the call to the function to prove it works
and that is only possible with internal knowledge.


>
> --
> Stuart.
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> https://lists.linaro.org/mailman/listinfo/lng-odp
>
diff mbox

Patch

diff --git a/configure.ac b/configure.ac
index 78ff245..c03778f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -138,6 +138,20 @@  AC_ARG_ENABLE([test-perf],
 AM_CONDITIONAL([test_perf], [test x$test_perf = xyes ])
 
 ##########################################################################
+# Enable/disable test-helper
+##########################################################################
+test_helper=no
+AC_ARG_ENABLE([test-helper],
+    [  --enable-test-helper      run test in test/helper],
+    [if test "x$enableval" = "xyes"; then
+        test_helper=yes
+    fi])
+
+AM_CONDITIONAL([test_helper], [test x$test_helper = xyes ])
+
+##########################################################################
+
+##########################################################################
 # Enable/disable test-cpp
 ##########################################################################
 test_cpp=no
@@ -284,6 +298,7 @@  AC_CONFIG_FILES([Makefile
 		 test/performance/Makefile
 		 test/validation/Makefile
 		 test/miscellaneous/Makefile
+		 test/helper/Makefile
 		 ])
 
 AC_SEARCH_LIBS([timer_create],[rt posix4])
diff --git a/test/Makefile.am b/test/Makefile.am
index 2ba8008..31872b0 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1,4 +1,7 @@ 
-SUBDIRS = api_test performance miscellaneous
+SUBDIRS = api_test \
+          performance \
+          miscellaneous \
+          helper
 
 if cunit_support
     SUBDIRS += validation
diff --git a/test/helper/.gitignore b/test/helper/.gitignore
new file mode 100644
index 0000000..fe65f30
--- /dev/null
+++ b/test/helper/.gitignore
@@ -0,0 +1,4 @@ 
+*.trs
+*.log
+odp_process
+odp_thread
diff --git a/test/helper/Makefile.am b/test/helper/Makefile.am
new file mode 100644
index 0000000..f330533
--- /dev/null
+++ b/test/helper/Makefile.am
@@ -0,0 +1,25 @@ 
+include $(top_srcdir)/test/Makefile.inc
+
+AM_CFLAGS += -I$(srcdir)/common
+AM_LDFLAGS += -static
+
+TESTS_ENVIRONMENT = ODP_PLATFORM=${with_platform} TEST_DIR=${builddir}
+
+EXECUTABLES = odp_thread \
+              odp_process
+
+COMPILE_ONLY =
+
+TESTSCRIPTS =
+
+if test_helper
+TESTS = $(EXECUTABLES) $(TESTSCRIPTS)
+endif
+
+dist_bin_SCRIPTS =
+
+bin_PROGRAMS = $(EXECUTABLES) $(COMPILE_ONLY)
+
+
+dist_odp_thread_SOURCES = odp_thread.c
+dist_odp_process_SOURCES = odp_process.c
diff --git a/test/helper/odp_process.c b/test/helper/odp_process.c
new file mode 100644
index 0000000..495cb00
--- /dev/null
+++ b/test/helper/odp_process.c
@@ -0,0 +1,85 @@ 
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include <test_debug.h>
+#include <odp.h>
+#include <odp/helper/linux.h>
+
+#define NUMBER_WORKERS 16 /* 0 = max */
+
+static void *worker_fn(void *arg TEST_UNUSED)
+{
+	/* depend on the odp helper to call odp_init_local */
+	printf("Worker thread on CPU %d\n", odp_cpu_id());
+
+	return 0;
+}
+
+/* Create additional dataplane processes */
+int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
+{
+	odp_cpumask_t cpu_mask;
+	int num_workers;
+	int cpu;
+	char cpumaskstr[ODP_CPUMASK_STR_SIZE];
+	int ret;
+	odph_linux_process_t proc[NUMBER_WORKERS];
+
+	if (odp_init_global(NULL, NULL)) {
+		LOG_ERR("Error: ODP global init failed.\n");
+		exit(EXIT_FAILURE);
+	}
+
+	if (odp_init_local()) {
+		LOG_ERR("Error: ODP local init failed.\n");
+		exit(EXIT_FAILURE);
+	}
+
+	/* discover how many threads this system can support */
+	num_workers = odph_linux_cpumask_default(&cpu_mask, NUMBER_WORKERS);
+	if (num_workers < NUMBER_WORKERS) {
+		printf("System can only support %d threads and not the %d requested\n",
+		       num_workers, NUMBER_WORKERS);
+	}
+
+	/* generate a summary for the user */
+	(void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr));
+	printf("default cpu mask:           %s\n", cpumaskstr);
+	printf("default num worker threads: %i\n", num_workers);
+
+	cpu = odp_cpumask_first(&cpu_mask);
+	printf("the first CPU:              %i\n", cpu);
+
+	/* reserve cpu 0 for the control plane so remove it from the default mask */
+	odp_cpumask_clr(&cpu_mask, 0);
+	num_workers = odp_cpumask_count(&cpu_mask);
+	(void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr));
+	printf("new cpu mask:               %s\n", cpumaskstr);
+	printf("new num worker threads:     %i\n\n", num_workers);
+
+	/* Fork worker processes */
+	ret = odph_linux_process_fork_n(proc, &cpu_mask);
+
+	if (ret < 0) {
+		LOG_ERR("Fork workers failed %i\n", ret);
+		return -1;
+	}
+
+	if (ret == 0) {
+		/* Child process */
+		worker_fn(NULL);
+	} else {
+		/* Parent process */
+		odph_linux_process_wait_n(proc, num_workers);
+
+		if (odp_term_global()) {
+			LOG_ERR("Error: ODP global term failed.\n");
+			exit(EXIT_FAILURE);
+		}
+	}
+
+	return 0;
+}
diff --git a/test/helper/odp_thread.c b/test/helper/odp_thread.c
new file mode 100644
index 0000000..04c6b1e
--- /dev/null
+++ b/test/helper/odp_thread.c
@@ -0,0 +1,79 @@ 
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include <test_debug.h>
+#include <odp.h>
+#include <odp/helper/linux.h>
+
+#define NUMBER_WORKERS 16
+static void *worker_fn(void *arg TEST_UNUSED)
+{
+	/* depend on the odp helper to call odp_init_local */
+
+	printf("Worker thread on CPU %d\n", odp_cpu_id());
+
+	/* depend on the odp helper to call odp_term_local */
+
+	return 0;
+}
+
+/* Create additional dataplane threads */
+int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
+{
+	odph_linux_pthread_t thread_tbl[NUMBER_WORKERS];
+	odp_cpumask_t cpu_mask;
+	int num_workers;
+	int cpu;
+	char cpumaskstr[ODP_CPUMASK_STR_SIZE];
+
+	if (odp_init_global(NULL, NULL)) {
+		LOG_ERR("Error: ODP global init failed.\n");
+		exit(EXIT_FAILURE);
+	}
+
+	if (odp_init_local()) {
+		LOG_ERR("Error: ODP local init failed.\n");
+		exit(EXIT_FAILURE);
+	}
+
+	/* discover how many threads this system can support */
+	num_workers = odph_linux_cpumask_default(&cpu_mask, NUMBER_WORKERS);
+	if (num_workers < NUMBER_WORKERS) {
+		printf("System can only support %d threads and not the %d requested\n",
+		       num_workers, NUMBER_WORKERS);
+	}
+
+	/* generate a summary for the user */
+	(void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr));
+	printf("default cpu mask:           %s\n", cpumaskstr);
+	printf("default num worker threads: %i\n", num_workers);
+
+	cpu = odp_cpumask_first(&cpu_mask);
+	printf("the first CPU:              %i\n", cpu);
+
+	/* reserve cpu 0 for the control plane so remove it from the default mask */
+	odp_cpumask_clr(&cpu_mask, 0);
+	num_workers = odp_cpumask_count(&cpu_mask);
+	(void)odp_cpumask_to_str(&cpu_mask, cpumaskstr, sizeof(cpumaskstr));
+	printf("new cpu mask:               %s\n", cpumaskstr);
+	printf("new num worker threads:     %i\n\n", num_workers);
+
+	odph_linux_pthread_create(&thread_tbl[0], &cpu_mask, worker_fn, NULL);
+
+	odph_linux_pthread_join(thread_tbl, num_workers);
+
+	if (odp_term_local()) {
+		LOG_ERR("Error: ODP local term failed.\n");
+		exit(EXIT_FAILURE);
+	}
+
+	if (odp_term_global()) {
+		LOG_ERR("Error: ODP global term failed.\n");
+		exit(EXIT_FAILURE);
+	}
+
+	return 0;
+}