Skip to content

Commit ae5b5ed

Browse files
CYFS3Rbb666
authored andcommitted
[action][utest]:Expand kernel auto-run matrix and sync test configs
1 parent b0e55a4 commit ae5b5ed

File tree

6 files changed

+129
-39
lines changed

6 files changed

+129
-39
lines changed

.github/workflows/utest_auto_run.yml

Lines changed: 76 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,51 @@ jobs:
5959
- "default.cfg"
6060

6161
include:
62-
# only run on qemu-vexpress-a9
62+
# run kernel utest set on all QEMU boards
6363
- platform: { UTEST: "A9", RTT_BSP: "bsp/qemu-vexpress-a9", QEMU_ARCH: "arm", QEMU_MACHINE: "vexpress-a9", SD_FILE: "sd.bin", KERNEL: "standard", "SMP_RUN":"" }
6464
config_file: "kernel/kernel_basic.cfg"
6565
- platform: { UTEST: "A9", RTT_BSP: "bsp/qemu-vexpress-a9", QEMU_ARCH: "arm", QEMU_MACHINE: "vexpress-a9", SD_FILE: "sd.bin", KERNEL: "standard", "SMP_RUN":"" }
6666
config_file: "kernel/ipc.cfg"
6767
- platform: { UTEST: "A9", RTT_BSP: "bsp/qemu-vexpress-a9", QEMU_ARCH: "arm", QEMU_MACHINE: "vexpress-a9", SD_FILE: "sd.bin", KERNEL: "standard", "SMP_RUN":"" }
6868
config_file: "kernel/mem.cfg"
69-
69+
- platform: { UTEST: "A9-rtsmart", RTT_BSP: "bsp/qemu-vexpress-a9", QEMU_ARCH: "arm", QEMU_MACHINE: "vexpress-a9", SD_FILE: "sd.bin", KERNEL: "rtsmart", "SMP_RUN":"" }
70+
config_file: "kernel/kernel_basic.cfg"
71+
- platform: { UTEST: "A9-rtsmart", RTT_BSP: "bsp/qemu-vexpress-a9", QEMU_ARCH: "arm", QEMU_MACHINE: "vexpress-a9", SD_FILE: "sd.bin", KERNEL: "rtsmart", "SMP_RUN":"" }
72+
config_file: "kernel/ipc.cfg"
73+
- platform: { UTEST: "A9-rtsmart", RTT_BSP: "bsp/qemu-vexpress-a9", QEMU_ARCH: "arm", QEMU_MACHINE: "vexpress-a9", SD_FILE: "sd.bin", KERNEL: "rtsmart", "SMP_RUN":"" }
74+
config_file: "kernel/mem.cfg"
75+
- platform: { UTEST: "A9-smp", RTT_BSP: "bsp/qemu-vexpress-a9", QEMU_ARCH: "arm", QEMU_MACHINE: "vexpress-a9", SD_FILE: "sd.bin", KERNEL: "standard", "SMP_RUN":"smp" }
76+
config_file: "kernel/kernel_basic.cfg"
77+
- platform: { UTEST: "A9-smp", RTT_BSP: "bsp/qemu-vexpress-a9", QEMU_ARCH: "arm", QEMU_MACHINE: "vexpress-a9", SD_FILE: "sd.bin", KERNEL: "standard", "SMP_RUN":"smp" }
78+
config_file: "kernel/ipc.cfg"
79+
- platform: { UTEST: "A9-smp", RTT_BSP: "bsp/qemu-vexpress-a9", QEMU_ARCH: "arm", QEMU_MACHINE: "vexpress-a9", SD_FILE: "sd.bin", KERNEL: "standard", "SMP_RUN":"smp" }
80+
config_file: "kernel/mem.cfg"
81+
- platform: { UTEST: "RISCV", RTT_BSP: "bsp/qemu-virt64-riscv", QEMU_ARCH: "riscv64", QEMU_MACHINE: "virt", SD_FILE: "None", KERNEL: "standard", "SMP_RUN":"" }
82+
config_file: "kernel/kernel_basic.cfg"
83+
- platform: { UTEST: "RISCV", RTT_BSP: "bsp/qemu-virt64-riscv", QEMU_ARCH: "riscv64", QEMU_MACHINE: "virt", SD_FILE: "None", KERNEL: "standard", "SMP_RUN":"" }
84+
config_file: "kernel/ipc.cfg"
85+
- platform: { UTEST: "RISCV", RTT_BSP: "bsp/qemu-virt64-riscv", QEMU_ARCH: "riscv64", QEMU_MACHINE: "virt", SD_FILE: "None", KERNEL: "standard", "SMP_RUN":"" }
86+
config_file: "kernel/mem.cfg"
87+
- platform: { UTEST: "RISCV-rtsmart", RTT_BSP: "bsp/qemu-virt64-riscv", QEMU_ARCH: "riscv64", QEMU_MACHINE: "virt", SD_FILE: "None", KERNEL: "rtsmart", "SMP_RUN":"" }
88+
config_file: "kernel/kernel_basic.cfg"
89+
- platform: { UTEST: "RISCV-rtsmart", RTT_BSP: "bsp/qemu-virt64-riscv", QEMU_ARCH: "riscv64", QEMU_MACHINE: "virt", SD_FILE: "None", KERNEL: "rtsmart", "SMP_RUN":"" }
90+
config_file: "kernel/ipc.cfg"
91+
- platform: { UTEST: "RISCV-rtsmart", RTT_BSP: "bsp/qemu-virt64-riscv", QEMU_ARCH: "riscv64", QEMU_MACHINE: "virt", SD_FILE: "None", KERNEL: "rtsmart", "SMP_RUN":"" }
92+
config_file: "kernel/mem.cfg"
93+
- platform: { UTEST: "XUANTIE-rtsmart", RTT_BSP: "bsp/xuantie/virt64/c906", QEMU_ARCH: "riscv64", QEMU_MACHINE: "virt", SD_FILE: "sd.bin", KERNEL: "rtsmart", "SMP_RUN":"" }
94+
config_file: "kernel/kernel_basic.cfg"
95+
- platform: { UTEST: "XUANTIE-rtsmart", RTT_BSP: "bsp/xuantie/virt64/c906", QEMU_ARCH: "riscv64", QEMU_MACHINE: "virt", SD_FILE: "sd.bin", KERNEL: "rtsmart", "SMP_RUN":"" }
96+
config_file: "kernel/ipc.cfg"
97+
- platform: { UTEST: "XUANTIE-rtsmart", RTT_BSP: "bsp/xuantie/virt64/c906", QEMU_ARCH: "riscv64", QEMU_MACHINE: "virt", SD_FILE: "sd.bin", KERNEL: "rtsmart", "SMP_RUN":"" }
98+
config_file: "kernel/mem.cfg"
99+
- platform: { UTEST: "RISCV-smp", RTT_BSP: "bsp/qemu-virt64-riscv", QEMU_ARCH: "riscv64", QEMU_MACHINE: "virt", SD_FILE: "None", KERNEL: "standard", "SMP_RUN":"smp" }
100+
config_file: "kernel/mem.cfg"
101+
- platform: { UTEST: "AARCH64", RTT_BSP: "bsp/qemu-virt64-aarch64", QEMU_ARCH: "aarch64", QEMU_MACHINE: "virt", SD_FILE: "sd.bin", KERNEL: "standard", "SMP_RUN":"" }
102+
config_file: "kernel/mem.cfg"
103+
- platform: { UTEST: "AARCH64-rtsmart", RTT_BSP: "bsp/qemu-virt64-aarch64", QEMU_ARCH: "aarch64", QEMU_MACHINE: "virt", SD_FILE: "sd.bin", KERNEL: "rtsmart", "SMP_RUN":"" }
104+
config_file: "kernel/mem.cfg"
105+
- platform: { UTEST: "AARCH64-smp", RTT_BSP: "bsp/qemu-virt64-aarch64", QEMU_ARCH: "aarch64", QEMU_MACHINE: "virt", SD_FILE: "sd.bin", KERNEL: "standard", "SMP_RUN":"smp" }
106+
config_file: "kernel/mem.cfg"
70107
- platform: { UTEST: "A9", RTT_BSP: "bsp/qemu-vexpress-a9", QEMU_ARCH: "arm", QEMU_MACHINE: "vexpress-a9", SD_FILE: "sd.bin", KERNEL: "standard", "SMP_RUN":"" }
71108
config_file: "kernel/atomic_c11.cfg"
72109
- platform: { UTEST: "RISCV", RTT_BSP: "bsp/qemu-virt64-riscv", QEMU_ARCH: "riscv64", QEMU_MACHINE: "virt", SD_FILE: "None", KERNEL: "standard", "SMP_RUN":"" }
@@ -273,38 +310,55 @@ jobs:
273310
274311
- name: Monitor qemu log
275312
if: ${{ env.TOOLCHAIN_INSTALLED != '' && success() }}
313+
timeout-minutes: 20
276314
run: |
277315
FAILURE_DETECTED=false
278316
ERROR_LOGS=""
317+
export FAILURE_DETECTED ERROR_LOGS
279318
280319
echo "=========================================================================================="
281320
echo " || || "
282321
echo " || Start automatic running of Utest || "
283322
echo " VV VV "
284323
echo "=========================================================================================="
285-
tail -n 0 -f qemu_output_$TEST_QEMU_ARCH.log | while read line; do
286-
echo $line
287-
if [[ "$line" == *"[ FAILED ] [ result ]"* ]]; then
288-
ERROR_LOGS="$ERROR_LOGS$line"$'\n'
289-
FAILURE_DETECTED=true
290-
fi
291-
292-
if [[ "$line" == *"[==========] [ utest ] finished"* ]]; then
293-
if $FAILURE_DETECTED; then
324+
timeout 20m bash -c '
325+
tail -n 0 -f "qemu_output_${TEST_QEMU_ARCH}.log" | while IFS= read -r line; do
326+
echo "$line"
327+
if [[ "$line" == *"[ FAILED ] [ result ]"* ]]; then
328+
ERROR_LOGS="${ERROR_LOGS}${line}"$'\''\n'\''
329+
FAILURE_DETECTED=true
330+
fi
331+
332+
if [[ "$line" == *"[==========] [ utest ] finished"* ]]; then
333+
if [[ "$FAILURE_DETECTED" == "true" ]]; then
334+
echo "=========================================================================================="
335+
echo " || || "
336+
echo " || Error: Failures detected in logs. Below are the failure details... || "
337+
echo " VV VV "
338+
echo "=========================================================================================="
339+
echo "$ERROR_LOGS"
340+
exit 1
341+
fi
294342
echo "=========================================================================================="
295-
echo " || || "
296-
echo " || Error: Failures detected in logs. Below are the failure details... || "
297-
echo " VV VV "
343+
echo " Successed: Utest run completed. Exiting log monitoring "
298344
echo "=========================================================================================="
299-
echo "$ERROR_LOGS"
300-
exit 1
345+
break
301346
fi
302-
echo "=========================================================================================="
303-
echo " Successed: Utest run completed. Exiting log monitoring "
304-
echo "=========================================================================================="
305-
break
306-
fi
307-
done
347+
done
348+
'
349+
monitor_status=$?
350+
351+
if [[ $monitor_status -eq 124 ]]; then
352+
echo "=========================================================================================="
353+
echo " || || "
354+
echo " || Error: Utest run timed out after 20 minutes. Exiting... || "
355+
echo " VV VV "
356+
echo "=========================================================================================="
357+
pkill -f "qemu-system-${TEST_QEMU_ARCH}.*${TEST_BSP_ROOT}/rtthread.bin" || true
358+
exit 1
359+
fi
360+
361+
exit $monitor_status
308362
# # Post CI status to PR comment
309363
# post-ci-status:
310364
# needs: test

examples/utest/configs/kernel/ipc.cfg

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ CONFIG_RT_UTEST_SIGNAL=y
99
CONFIG_RT_UTEST_MUTEX=y
1010
CONFIG_RT_UTEST_MAILBOX=y
1111

12+
CONFIG_RT_UTEST_COMPLETION=y
13+
CONFIG_RT_UTEST_WORKQUEUE=y
14+
1215
CONFIG_RT_USING_SEMAPHORE=y
1316
CONFIG_RT_USING_EVENT=y
1417
CONFIG_RT_USING_MESSAGEQUEUE=y

examples/utest/configs/kernel/kernel_basic.cfg

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
CONFIG_RT_CONSOLEBUF_SIZE=1024
33
CONFIG_RT_USING_CI_ACTION=y
44

5+
CONFIG_RT_UTEST_TIMER=y
6+
CONFIG_RT_UTEST_TC_USING_KLIBC=y
57
CONFIG_RT_UTEST_OBJECT=y
68
CONFIG_RT_UTEST_IRQ=y
79
CONFIG_RT_UTEST_THREAD=y

src/utest/object_tc.c

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
#define TEST_RT_NAME_MAX RT_NAME_MAX
7878
#define OBJECT_STRESS_BATCH 24
7979
#define OBJECT_STRESS_ROUNDS 3
80+
#define OBJECT_THREAD_STACK_SIZE 1024
8081

8182
#ifndef ARRAY_SIZE
8283
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
@@ -140,6 +141,16 @@ static rt_err_t generate_unique_name(char *buf,
140141
return -RT_ENOMEM;
141142
}
142143

144+
static void object_find_test_thread_entry(void *parameter)
145+
{
146+
RT_UNUSED(parameter);
147+
148+
while (1)
149+
{
150+
rt_thread_mdelay(10);
151+
}
152+
}
153+
143154
static void test_object_name_handling(void)
144155
{
145156
struct rt_object static_obj;
@@ -187,6 +198,7 @@ static void test_object_find_operations(void)
187198
rt_thread_t found_thread;
188199
rt_object_t found;
189200
char missing_name[] = "object.not.exists";
201+
rt_err_t ret;
190202

191203
uassert_true(generate_unique_name(name, sizeof(name), "sobj", RT_Object_Class_Thread) == RT_EOK);
192204
rt_object_init(&static_obj, RT_Object_Class_Thread, name);
@@ -197,14 +209,21 @@ static void test_object_find_operations(void)
197209
rt_object_detach(&static_obj);
198210

199211
uassert_true(generate_unique_name(name, sizeof(name), "thr", RT_Object_Class_Thread) == RT_EOK);
200-
thread = rt_thread_create(name, RT_NULL, RT_NULL, 512, RT_THREAD_PRIORITY_MAX / 2, 10);
212+
thread = rt_thread_create(name, object_find_test_thread_entry, RT_NULL,
213+
OBJECT_THREAD_STACK_SIZE, RT_THREAD_PRIORITY_MAX / 2, 10);
201214
uassert_not_null(thread);
215+
ret = rt_thread_startup(thread);
216+
uassert_int_equal(ret, RT_EOK);
202217
found_thread = rt_thread_find(name);
203218
uassert_not_null(found_thread);
204219
uassert_ptr_equal(found_thread, thread);
205220
uassert_str_equal(found_thread->parent.name, name);
206-
rt_thread_delete(thread);
207-
rt_thread_mdelay(10);
221+
ret = rt_thread_delete(thread);
222+
uassert_int_equal(ret, RT_EOK);
223+
for (int i = 0; i < 10 && rt_thread_find(name) != RT_NULL; i++)
224+
{
225+
rt_thread_mdelay(100);
226+
}
208227
uassert_null(rt_thread_find(name));
209228

210229
#ifdef RT_USING_DEVICE

src/utest/perf/thread_mbox_tc.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ static void perf_thread_mbox1(void *parameter)
8181
static void perf_thread_mbox2(void *parameter)
8282
{
8383
rt_perf_t *perf = (rt_perf_t *)parameter;
84-
rt_err_t ret = RT_EOK;
8584
while (1)
8685
{
8786
if (perf->count >= RT_UTEST_SYS_PERF_TC_COUNT)

src/utest/thread_overflow_tc.c

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include "utest.h"
1313

1414
#define UTEST_NAME "thread_overflow_tc"
15-
#define TEST_STACK_SIZE 512
15+
#define TEST_STACK_SIZE UTEST_THR_STACK_SIZE
1616

1717
/* Test thread stack overflow */
1818
static rt_thread_t test_thread = RT_NULL;
@@ -34,7 +34,7 @@ static rt_err_t stack_overflow_hook(struct rt_thread *thread)
3434
static void stack_usage_test(void)
3535
{
3636
rt_thread_t current_thread;
37-
rt_uint32_t total_stack, used_stack;
37+
rt_uintptr_t total_stack, used_stack;
3838

3939
current_thread = rt_thread_self();
4040
uassert_not_null(current_thread);
@@ -49,10 +49,10 @@ static void stack_usage_test(void)
4949

5050
#ifdef ARCH_CPU_STACK_GROWS_UPWARD
5151
/* For upward growing stacks */
52-
used_stack = (rt_uint32_t)current_thread->sp - (rt_uint32_t)current_thread->stack_addr;
52+
used_stack = (rt_uintptr_t)current_thread->sp - (rt_uintptr_t)current_thread->stack_addr;
5353
#else
5454
/* For downward growing stacks (most common) */
55-
used_stack = (rt_uint32_t)current_thread->stack_addr + total_stack - (rt_uint32_t)current_thread->sp;
55+
used_stack = (rt_uintptr_t)current_thread->stack_addr + total_stack - (rt_uintptr_t)current_thread->sp;
5656
#endif
5757

5858
rt_kprintf("Used stack: %d bytes (%d%%)\n",
@@ -142,11 +142,11 @@ static void stack_overflow_hook_test(void)
142142
/* Fake thread test entry function */
143143
static void fake_thread_entry(void *parameter)
144144
{
145-
/* This function should never actually run */
146-
rt_kprintf("Fake thread is running - this should not happen!\n");
145+
RT_UNUSED(parameter);
146+
147147
while (1)
148148
{
149-
rt_thread_mdelay(1000);
149+
rt_thread_mdelay(100);
150150
}
151151
}
152152

@@ -178,14 +178,18 @@ static void fake_thread_stack_overflow_test(void)
178178
}
179179

180180
rt_kprintf("Fake thread created successfully\n");
181+
uassert_int_equal(rt_thread_startup(fake_thread), RT_EOK);
182+
rt_thread_mdelay(10);
181183

182-
rt_kprintf("Corrupting fake thread stack with pattern 0x11...\n");
183-
rt_memset(fake_thread->stack_addr, 0x11, fake_thread->stack_size);
184-
185-
/* Also corrupt the magic number area if stack checking is enabled */
184+
rt_kprintf("Corrupting fake thread stack sentinel...\n");
186185
#ifdef RT_USING_OVERFLOW_CHECK
187-
/* For downward growing stacks, magic is typically at the beginning */
188-
rt_memset(fake_thread->stack_addr, 0x11, 4); /* Corrupt first 4 bytes */
186+
/* Only corrupt the sentinel bytes used by overflow detection. */
187+
#ifdef ARCH_CPU_STACK_GROWS_UPWARD
188+
rt_memset((rt_uint8_t *)fake_thread->stack_addr + fake_thread->stack_size - sizeof(rt_ubase_t),
189+
0x11, sizeof(rt_ubase_t));
190+
#else
191+
rt_memset(fake_thread->stack_addr, 0x11, sizeof(rt_ubase_t));
192+
#endif
189193
rt_kprintf("Stack magic number area corrupted\n");
190194
#endif
191195

@@ -204,6 +208,11 @@ static void fake_thread_stack_overflow_test(void)
204208
if (fake_thread != RT_NULL)
205209
{
206210
rt_thread_delete(fake_thread);
211+
for (int i = 0; i < 10 && rt_thread_find("fake_thread") != RT_NULL; i++)
212+
{
213+
rt_thread_mdelay(10);
214+
}
215+
uassert_null(rt_thread_find("fake_thread"));
207216
fake_thread = RT_NULL;
208217
rt_kprintf("Fake thread deleted\n");
209218
}
@@ -250,6 +259,10 @@ static rt_err_t utest_tc_cleanup(void)
250259
if (fake_thread != RT_NULL)
251260
{
252261
rt_thread_delete(fake_thread);
262+
for (int i = 0; i < 10 && rt_thread_find("fake_thread") != RT_NULL; i++)
263+
{
264+
rt_thread_mdelay(10);
265+
}
253266
fake_thread = RT_NULL;
254267
}
255268

0 commit comments

Comments
 (0)