diff mbox

cunit: odp_init_local: add sunny day

Message ID 1416343791-6774-1-git-send-email-madhusudan.venugopal@linaro.org
State New
Headers show

Commit Message

Madhusudan Venugopal Nov. 18, 2014, 8:49 p.m. UTC
This test adds a sunny day unit test for odp_init_local() and odp_init_term()

Signed-off-by: Madhusudan Venugopal <madhusudan.venugopal@linaro.org>
---
 .gitignore                  |   1 +
 test/cunit/Makefile.am      |   5 +-
 test/cunit/odp_init_local.c | 139 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 144 insertions(+), 1 deletion(-)
 create mode 100644 test/cunit/odp_init_local.c

Comments

Taras Kondratiuk Nov. 19, 2014, 8:32 a.m. UTC | #1
On 11/18/2014 10:49 PM, Madhusudan Venugopal wrote:
> This test adds a sunny day unit test for odp_init_local() and odp_init_term()
>
> Signed-off-by: Madhusudan Venugopal <madhusudan.venugopal@linaro.org>
> ---
>   .gitignore                  |   1 +
>   test/cunit/Makefile.am      |   5 +-
>   test/cunit/odp_init_local.c | 139 ++++++++++++++++++++++++++++++++++++++++++++
>   3 files changed, 144 insertions(+), 1 deletion(-)
>   create mode 100644 test/cunit/odp_init_local.c

What is the reason to separate global_init and local_init tests into
separate executables?
diff mbox

Patch

diff --git a/.gitignore b/.gitignore
index 90db906..55a5d2b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -49,3 +49,4 @@  doxygen-doc
 test-driver
 test/cunit/*.log
 test/cunit/*.trs
+test/cunit/odp_init_local
diff --git a/test/cunit/Makefile.am b/test/cunit/Makefile.am
index 439e134..29e64b3 100644
--- a/test/cunit/Makefile.am
+++ b/test/cunit/Makefile.am
@@ -6,10 +6,13 @@  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
+bin_PROGRAMS = odp_init odp_queue odp_init_local
 odp_init_LDFLAGS = $(AM_LDFLAGS)
 odp_queue_LDFLAGS = $(AM_LDFLAGS)
+odp_init_local_LDFLAGS = $(AM_LDFLAGS)
+
 endif
 
 dist_odp_init_SOURCES = odp_init.c
 dist_odp_queue_SOURCES = odp_queue.c
+dist_odp_init_local_SOURCES = odp_init_local.c
diff --git a/test/cunit/odp_init_local.c b/test/cunit/odp_init_local.c
new file mode 100644
index 0000000..11f2fad
--- /dev/null
+++ b/test/cunit/odp_init_local.c
@@ -0,0 +1,139 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include "odp.h"
+#include "CUnit/Basic.h"
+#include <odph_linux.h>
+
+void *odp_init_test(void *arg);
+static void odp_init_local_singlethread_sunnyday(void);
+static void odp_init_local_thread_per_core_sunnyday(void);
+static int init(void);
+
+#define MAX_WORKERS           32
+#define FIRST_CORE            0
+#define SINGLE_THREAD         1
+
+/* Test to check if the thread is able to initialize using
+ * odp_init_local() and can terminate using odp_term_local().
+ * odp_init_local() will return 0 if successful intialization.
+ * odp_term_local() will return 0 if successful termination.
+ */
+
+void *odp_init_test(void *arg)
+{
+	int status;
+
+	status = odp_init_local();
+	CU_ASSERT(!status);
+
+	status = odp_term_local();
+	CU_ASSERT(!status);
+
+	return arg;
+}
+
+int init(void)
+{
+	printf("\t ODP version: %s\n", odp_version_api_str());
+	return 0;
+}
+
+/* Test for initialization and termination of single odp thread */
+
+void odp_init_local_singlethread_sunnyday(void)
+{
+	int status;
+	odph_linux_pthread_t thread;
+
+	status = odp_init_global(NULL, NULL);
+	CU_ASSERT(!status);
+
+	status = odp_init_local();
+	CU_ASSERT(!status);
+
+	odph_linux_pthread_create(&thread, SINGLE_THREAD, FIRST_CORE,
+				  odp_init_test, NULL);
+	odph_linux_pthread_join(&thread, 1);
+
+	status = odp_term_local();
+	CU_ASSERT(!status);
+
+	status = odp_term_global();
+	CU_ASSERT(!status);
+}
+
+/* Test for initialization and termination of multiple odp threads
+ * One odp thread per core.
+ */
+
+void odp_init_local_thread_per_core_sunnyday(void)
+{
+	odph_linux_pthread_t thread_tbl[MAX_WORKERS];
+	int num_workers;
+	int status, first_core;
+	first_core = 1;
+
+	status = odp_init_global(NULL, NULL);
+	CU_ASSERT(!status);
+	status = odp_init_local();
+	CU_ASSERT(!status);
+
+	num_workers = odp_sys_core_count();
+	if (1 == num_workers)
+		first_core = 0;
+
+	if (MAX_WORKERS < num_workers)
+		num_workers = MAX_WORKERS;
+
+	odph_linux_pthread_create(thread_tbl, num_workers, first_core,
+				  odp_init_test, NULL);
+
+	/* if the number of cores  in the system is 1, we have to use  core 0.
+	 * However if the number of cores is more than 1, we can leave core 0
+	 * for linux system and this how we expect odp systems to be used.
+	 */
+
+	odph_linux_pthread_join(thread_tbl, num_workers);
+
+	status = odp_term_local();
+	CU_ASSERT(!status);
+
+	status = odp_term_global();
+	CU_ASSERT(!status);
+}
+
+int main(void)
+{
+	CU_pSuite p_suite;
+	CU_pTest ret;
+
+	if (CUE_SUCCESS != CU_initialize_registry())
+		return CU_get_error();
+
+	p_suite = CU_add_suite(__FILE__, init, NULL);
+	if (!p_suite) {
+		CU_cleanup_registry();
+		return CU_get_error();
+	}
+
+	ret = CU_ADD_TEST(p_suite, odp_init_local_singlethread_sunnyday);
+	if (!ret) {
+		CU_cleanup_registry();
+		return CU_get_error();
+	}
+
+	ret = CU_ADD_TEST(p_suite, odp_init_local_thread_per_core_sunnyday);
+	if (!ret) {
+		CU_cleanup_registry();
+		return CU_get_error();
+	}
+
+	CU_basic_set_mode(CU_BRM_VERBOSE);
+	CU_basic_run_tests();
+	CU_cleanup_registry();
+	return CU_get_error();
+}