tests: kernel: Move k_thread_foreach() API test to thread_apis test

Move k_thread_foreach() API test from tests/kernel/profiling to
tests/kernel/threads/thread_apis.

Fixes #7966

Signed-off-by: Ramakrishna Pallala <ramakrishna.pallala@intel.com>
This commit is contained in:
Ramakrishna Pallala 2018-06-04 10:58:31 +05:30 committed by Anas Nashif
commit 00e29c176d
4 changed files with 99 additions and 77 deletions

View file

@ -15,14 +15,6 @@
static struct k_work work[NUM_OF_WORK];
static struct k_sem sync_sema;
#define STACKSIZE 512
K_THREAD_STACK_DEFINE(test_stack, STACKSIZE);
__kernel struct k_thread test_thread;
static int tcount;
static bool thread_flag;
static bool stack_flag;
/**TESTPOINT: stack analyze*/
static void tdata_dump_callback(const struct k_thread *thread, void *user_data)
{
@ -81,79 +73,13 @@ void test_call_stacks_analyze_workq(void)
}
}
static void thread_entry(void *p1, void *p2, void *p3)
{
k_sleep(SLEEP_MS);
}
static void thread_callback(const struct k_thread *thread, void *user_data)
{
char *str = (char *)user_data;
if (thread == &test_thread) {
TC_PRINT("%s: Newly added thread found\n", str);
TC_PRINT("%s: tid: %p, prio: %d\n",
str, thread, thread->base.prio);
thread_flag = true;
}
if ((char *)thread->stack_info.start ==
K_THREAD_STACK_BUFFER(test_stack)) {
TC_PRINT("%s: Newly added thread stack found\n", str);
TC_PRINT("%s: stack:%p, size:%u\n", str,
(char *)thread->stack_info.start,
thread->stack_info.size);
stack_flag = true;
}
tcount++;
}
static void test_k_thread_foreach(void)
{
int count;
/* Call k_thread_foreach() and check
* thread_callback is getting called.
*/
k_thread_foreach(thread_callback, TEST_STRING);
/* Check thread_count non-zero, thread_flag
* and stack_flag are not set.
*/
zassert_true(tcount && !thread_flag && !stack_flag,
"thread_callback() not getting called");
/* Save the initial thread count */
count = tcount;
/* Create new thread which should add a new entry to the thread list */
k_tid_t tid = k_thread_create(&test_thread, test_stack,
STACKSIZE, (k_thread_entry_t)thread_entry, NULL,
NULL, NULL, K_PRIO_PREEMPT(0), 0, 0);
k_sleep(1);
/* Call k_thread_foreach() and check
* thread_callback is getting called for
* the newly added thread.
*/
tcount = 0;
k_thread_foreach(thread_callback, TEST_STRING);
/* Check thread_count > temp, thread_flag and stack_flag are set */
zassert_true((tcount > count) && thread_flag && stack_flag,
"thread_callback() not getting called");
k_thread_abort(tid);
}
/*TODO: add test case to capture the usage of interrupt call stack*/
void test_main(void)
{
ztest_test_suite(profiling_api,
ztest_unit_test(test_call_stacks_analyze_main),
ztest_unit_test(test_call_stacks_analyze_idle),
ztest_unit_test(test_call_stacks_analyze_workq),
ztest_unit_test(test_k_thread_foreach));
ztest_unit_test(test_call_stacks_analyze_workq));
ztest_run_test_suite(profiling_api);
}

View file

@ -1,4 +1,5 @@
CONFIG_ZTEST=y
CONFIG_THREAD_MONITOR=y
CONFIG_HEAP_MEM_POOL_SIZE=256
CONFIG_THREAD_CUSTOM_DATA=y
CONFIG_THREAD_STACK_INFO=y
CONFIG_HEAP_MEM_POOL_SIZE=256

View file

@ -28,6 +28,7 @@ extern void test_abort_handler(void);
extern void test_essential_thread_operation(void);
extern void test_threads_priority_set(void);
extern void test_delayed_thread_abort(void);
extern void test_k_thread_foreach(void);
__kernel struct k_thread tdata;
#define STACK_SIZE (256 + CONFIG_TEST_EXTRA_STACKSIZE)
@ -135,7 +136,8 @@ void test_main(void)
ztest_unit_test(test_systhreads_main),
ztest_unit_test(test_systhreads_idle),
ztest_unit_test(test_customdata_get_set_coop),
ztest_user_unit_test(test_customdata_get_set_preempt)
ztest_user_unit_test(test_customdata_get_set_preempt),
ztest_unit_test(test_k_thread_foreach)
);
ztest_run_test_suite(threads_lifecycle);

View file

@ -0,0 +1,93 @@
/*
* Copyright (c) 2018 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <ztest.h>
#include <irq_offload.h>
#include <misc/stack.h>
#define SLEEP_MS 100
#define TEST_STRING "TEST"
#define STACKSIZE (256 + CONFIG_TEST_EXTRA_STACKSIZE)
K_THREAD_STACK_EXTERN(tstack);
extern struct k_thread tdata;
static int tcount;
static bool thread_flag;
static bool stack_flag;
static void thread_entry(void *p1, void *p2, void *p3)
{
k_sleep(SLEEP_MS);
}
static void thread_callback(const struct k_thread *thread, void *user_data)
{
char *str = (char *)user_data;
if (thread == &tdata) {
TC_PRINT("%s: Newly added thread found\n", str);
TC_PRINT("%s: tid: %p, prio: %d\n",
str, thread, thread->base.prio);
thread_flag = true;
}
if ((char *)thread->stack_info.start ==
K_THREAD_STACK_BUFFER(tstack)) {
TC_PRINT("%s: Newly added thread stack found\n", str);
TC_PRINT("%s: stack:%p, size:%u\n", str,
(char *)thread->stack_info.start,
thread->stack_info.size);
stack_flag = true;
}
tcount++;
}
/**
* @ingroup kernel_thread_tests
* @brief Test k_thread_foreach API
*
* @details Call k_thread_foreach() at the beginning of the test and
* call it again after creating a thread, See k_thread_foreach()
* iterates over the newly created thread and calls the user passed
* callback function.
*
* @see k_thread_foreach()
*/
void test_k_thread_foreach(void)
{
int count;
k_thread_foreach(thread_callback, TEST_STRING);
/* Check thread_count non-zero, thread_flag
* and stack_flag are not set.
*/
zassert_true(tcount && !thread_flag && !stack_flag,
"thread_callback() not getting called");
/* Save the initial thread count */
count = tcount;
/* Create new thread which should add a new entry to the thread list */
k_tid_t tid = k_thread_create(&tdata, tstack,
STACKSIZE, (k_thread_entry_t)thread_entry, NULL,
NULL, NULL, K_PRIO_PREEMPT(0), 0, 0);
k_sleep(1);
/* Call k_thread_foreach() and check
* thread_callback is getting called for
* the newly added thread.
*/
tcount = 0;
k_thread_foreach(thread_callback, TEST_STRING);
/* Check thread_count > temp, thread_flag and stack_flag are set */
zassert_true((tcount > count) && thread_flag && stack_flag,
"thread_callback() not getting called");
k_thread_abort(tid);
}