Most test cases in src/utest lack standardized functional documentation, as tracked in issue [#10895](https://github.com/RT-Thread/rt-thread/issues/10895). This leads to high maintenance costs, difficulty for new contributors, and inefficient code reviews.
RT-Thread BSP Static Build Check / 🔍 Summary of Git Diff Changes (push) Has been cancelled
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (push) Has been cancelled
RT-Thread BSP Static Build Check / collect-artifacts (push) Has been cancelled
doc_doxygen / doxygen_doc generate (push) Has been cancelled
doc_doxygen / deploy (push) Has been cancelled
pkgs_test / change (push) Has been cancelled
utest_auto_run / A9 :components/dfs.cfg (push) Has been cancelled
utest_auto_run / A9 :components/lwip.cfg (push) Has been cancelled
utest_auto_run / A9 :components/netdev.cfg (push) Has been cancelled
utest_auto_run / A9 :components/sal.cfg (push) Has been cancelled
utest_auto_run / A9 :cpp11/cpp11.cfg (push) Has been cancelled
utest_auto_run / AARCH64-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64 :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64-smp :default.cfg (push) Has been cancelled
utest_auto_run / A9 :default.cfg (push) Has been cancelled
utest_auto_run / A9-smp :default.cfg (push) Has been cancelled
utest_auto_run / RISCV :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-smp :default.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/mem.cfg (push) Has been cancelled
Weekly CI Scheduler / Trigger and Monitor CIs (push) Has been cancelled
Weekly CI Scheduler / Create Discussion Report (push) Has been cancelled

Solution:
This patch adds the full, standardized documentation block to `sched_mtx_tc.c`, `sched_sem_tc.c`, `sched_thread_tc.c`, `sched_timed_mtx_tc.c` and `sched_timed_sem_tc.c` following the approved template.

The documentation details:
- Test Objectives and tested APIs
- Test Scenarios
- Verification Metrics
- Dependencies
- Test Execution command and Expected Results

This makes the test case's purpose and behavior immediately clear to future maintainers and reviewers.

Relates to [#10895](https://github.com/RT-Thread/rt-thread/issues/10895)

Signed-off-by: lhxj <2743257167@qq.com>
This commit is contained in:
lhxj
2025-12-14 21:14:48 +08:00
committed by R b b666
parent cbf3f8c3b4
commit 5782174905
5 changed files with 249 additions and 0 deletions
+49
View File
@@ -6,7 +6,56 @@
* Change Logs:
* Date Author Notes
* 2024-01-17 Shell the first version
* 2025-12-12 lhxj Add standardized utest documentation block
*/
/**
* Test Case Name: Scheduler Mutex Stress Test (core.scheduler_mutex)
*
* Test Objectives:
* - Validate the stability of the Mutex subsystem under high contention (Stress Test).
* - Ensure priority inheritance (if supported) or basic blocking/waking works correctly.
* - In multi-core systems, verify data consistency and spinlock mechanisms when multiple cores contend for a single kernel object simultaneously.
* - List specific functions or APIs to be tested:
* - rt_mutex_take()
* - rt_mutex_release()
* - rt_thread_create()
*
* Test Scenarios:
* - **Stress Test (mutex_stress_tc):**
* 1. Create `RT_CPUS_NR` threads (e.g., 4 threads in a Quad-Core setup).
* 2. Assign **staggered priorities** to these threads (`priority_base + i % range`) to simulate contention between high and low priority tasks.
* 3. All tester threads execute a tight loop: attempting to take and immediately release the *same* global mutex (`_racing_lock`).
* - In SMP, this simulates true parallel contention.
* 4. The main test thread sleeps for `TEST_SECONDS` (30s), periodically printing progress.
* 5. After time is up, signal threads to exit (`_exit_flag`) and wait for them using a semaphore (`_thr_exit_sem`).
*
* Verification Metrics:
* - **Pass:** The system must remain responsive (no deadlocks, hard faults, or RCU stalls) during the 30-second run.
* - **Pass:** The main thread must successfully wait for all tester threads to exit (`rt_sem_take` returns `RT_EOK`).
* - **Pass:** `uassert_true(1)` is executed periodically, confirming the main loop is alive.
*
* Dependencies:
* - Hardware requirements (e.g., specific peripherals)
* - No specific peripherals required, but Multi-core CPU recommended for SMP testing.
* (This is met by the qemu-virt64-riscv BSP).
* - Software configuration (e.g., kernel options, driver initialization)
* - `RT_USING_UTEST` must be enabled (`RT-Thread Utestcases`).
* - `Scheduler Test` must be enabled (`RT-Thread Utestcases` -> `Kernel Core` -> 'Scheduler Test').
* - (Optional) Enable SMP for parallel testing:
* - Go to `RT-Thread Kernel` -> `Enable SMP (Symmetric multiprocessing)`.
* - Set `Number of CPUs` to > 1 (e.g., 4).
* - Environmental assumptions
* - Requires sufficient heap memory to allocate stacks for `RT_CPUS_NR` threads.
* - Run the test case from the msh prompt:
* `utest_run core.scheduler_mutex`
*
* Expected Results:
* - The test continues for approximately 30 seconds.
* - The console logs periodic success assertions.
* - Final Output: `[ PASSED ] [ result ] testcase (core.scheduler_mutex)`
*/
#include <rtthread.h>
#include <stdlib.h>
#include "utest.h"
+53
View File
@@ -6,7 +6,60 @@
* Change Logs:
* Date Author Notes
* 2024-01-17 Shell the first version
* 2025-12-12 lhxj Add standardized utest documentation block
*/
/**
* Test Case Name: Priority Based Semaphore Synchronization Test (core.scheduler_sem)
*
* Test Objectives:
* - Verify the stability and correctness of the scheduler under high concurrency.
* - Verify thread synchronization and execution order using Semaphore chains across different priority levels.
* - Verify SMP (Symmetric Multiprocessing) load balancing and atomic operations in a multi-core environment.
* - List specific functions or APIs to be tested:
* - rt_sem_init
* - rt_sem_take
* - rt_sem_release
* - rt_thread_create
* - rt_thread_startup
* - rt_atomic_add
*
* Test Scenarios:
* - **Semaphore Chained Scheduling:**
* 1. Initialize a "thread matrix" where threads are created across multiple priority levels (`TEST_LEVEL_COUNTS`).
* 2. For each priority level, create multiple concurrent threads (`RT_CPUS_NR * 2`).
* 3. Establish a dependency chain (Ring Topology):
* - **Level 0 threads:** Notify Level 1, then wait for their own resource.
* - **Middle Level threads:** Wait for their resource (notified by Level N-1), then notify Level N+1.
* - **Last Level threads:** Wait for their resource, print status (CPU ID), delay, then notify Level 0.
* 4. Each thread increments an atomic load counter for the specific CPU it is running on.
* 5. The main test thread waits for all sub-threads to signal completion via `_thr_exit_sem`.
*
* Verification Metrics:
* - **Pass:** All created threads must complete their execution loops without deadlocking.
* - **Pass:** The sum of execution counts across all CPUs (`_load_average`) must equal the calculated expected total (`KERN_TEST_CONFIG_LOOP_TIMES * TEST_LEVEL_COUNTS * KERN_TEST_CONCURRENT_THREADS`).
*
* Dependencies:
* - Hardware requirements
* - No specific peripherals required, but multi-core CPU is recommended for SMP verification.
* (This is met by the qemu-virt64-riscv BSP).
* - Software configuration
* - `RT_USING_UTEST` must be enabled (`RT-Thread Utestcases`).
* - `Scheduler Test` must be enabled (`RT-Thread Utestcases` -> `Kernel Core` -> 'Scheduler Test').
* - (Optional) Enable SMP for parallel testing (Highly Recommended):
* - Go to `RT-Thread Kernel` -> `Enable SMP (Symmetric multiprocessing)`.
* - Set `Number of CPUs` to > 1 (e.g., 2 or 4).
* - Environmental assumptions
* - The system must support enough valid priority levels (`RT_THREAD_PRIORITY_MAX`) to accommodate `TEST_LEVEL_COUNTS`.
* - Run the test case from the msh prompt:
* `utest_run core.scheduler_sem`
*
* Expected Results:
* - The console should print character patterns (e.g., `*0*1...`) indicating thread activity on specific CPUs.
* - The final load statistics per CPU should be printed.
* - Final Output: `[ PASSED ] [ result ] testcase (core.scheduler_sem)`
*/
#define __RT_IPC_SOURCE__
#include <rtthread.h>
+51
View File
@@ -6,7 +6,58 @@
* Change Logs:
* Date Author Notes
* 2024-01-25 Shell init ver.
* 2025-12-12 lhxj Add standardized utest documentation block
*/
/**
* Test Case Name: Scheduler Thread Stability Test (core.scheduler_thread)
*
* Test Objectives:
* - Verify the stability of the scheduler during intensive context switching.
* - Test the interaction between `rt_thread_suspend` and `rt_thread_resume` within critical sections.
* - Verify scheduler robustness in multi-core environments (using `RT_CPUS_NR`) ensuring no deadlocks or race conditions occur during thread state transitions.
* - List specific functions or APIs to be tested:
* - rt_thread_create
* - rt_thread_startup
* - rt_thread_suspend
* - rt_thread_resume
* - rt_enter_critical / rt_exit_critical_safe
* - rt_atomic_add
*
* Test Scenarios:
* - **Multi-threaded Ping-Pong Context Switching:**
* 1. Initialize a semaphore `_thr_exit_sem` for completion synchronization.
* 2. Create `TEST_THREAD_COUNT` pairs of threads (based on `RT_CPUS_NR`).
* 3. Each thread pair performs a "ping-pong" operation in a loop (100,000 iterations):
* - Thread A enters critical section, suspends self, resumes Thread B, exits critical section.
* - Thread B enters critical section, suspends self, resumes Thread A, exits critical section.
* 4. An atomic counter `_progress_counter` tracks execution progress, triggering `uassert_true` at intervals.
* 5. The main test thread waits for all worker threads to signal completion via the semaphore.
*
* Verification Metrics:
* - **Pass:** All created threads complete their execution loops without system hangs or crashes.
* - **Pass:** The progress counter increments as expected, validating thread execution flow.
*
* Dependencies:
* - Hardware requirements (e.g., specific peripherals)
* - No specific peripherals required.
* (This is met by the qemu-virt64-riscv BSP).
* - Software configuration (e.g., kernel options, driver initialization)
* - `RT_USING_UTEST` must be enabled (`RT-Thread Utestcases`).
* - `Scheduler Test` must be enabled (`RT-Thread Utestcases` -> `Kernel Core` -> 'Scheduler Test').
* - (Optional) Enable SMP for parallel testing:
* - Go to `RT-Thread Kernel` -> `Enable SMP (Symmetric multiprocessing)`.
* - Set `Number of CPUs` to > 1 (e.g., 4).
* - Environmental assumptions
* - `UTEST_THR_STACK_SIZE` is sufficient for the test threads.
* - Run the test case from the msh prompt:
* `utest_run core.scheduler_thread`
*
* Expected Results:
* - The test proceeds through multiple loops of thread suspension and resumption.
* - Final Output: `[ PASSED ] [ result ] testcase (core.scheduler_thread)`
*/
#define __RT_KERNEL_SOURCE__
#include <rtthread.h>
#include "utest.h"
+47
View File
@@ -6,7 +6,54 @@
* Change Logs:
* Date Author Notes
* 2024-01-25 Shell init ver.
* 2025-12-12 lhxj Add standardized utest documentation block
*/
/**
* Test Case Name: Timed Mutex Race Condition Test (core.scheduler_timed_mtx)
*
* Test Objectives:
* - Verify mutex behavior when a timeout race condition occurs between the timeout timer (scheduler) and mutex release.
* - Ensure strict round-robin ownership (Producer <-> Consumer) is maintained despite timeouts.
* - Validate that `rt_mutex_take_interruptible` correctly handles timeouts returning `-RT_ETIMEOUT`.
* - Ensure a thread does not hold the mutex if it reports a timeout.
* - List specific functions or APIs to be tested:
* - rt_mutex_take_interruptible
* - rt_mutex_take
* - rt_mutex_release
* - rt_tick_get
*
* Test Scenarios:
* - **Timeout vs Release Race:**
* 1. Create a Producer thread and a Consumer thread.
* 2. Producer acquires the mutex, aligns execution to the system tick edge (`_wait_until_edge`) with random latency, and releases the mutex.
* 3. Consumer attempts to acquire the mutex with a short timeout (1 tick) using `rt_mutex_take_interruptible`.
* 4. Verify that if Consumer times out, it does not hold the mutex.
* 5. Verify that if Consumer acquires the mutex, strict ownership order (Producer -> Consumer) was followed using magic flags.
* 6. Repeat for `TEST_LOOP_TICKS`.
*
* Verification Metrics:
* - **Pass:** The mutex ownership sequence (Consumer -> Producer -> Consumer) is never violated.
* - **Pass:** `rt_mutex_get_owner` returns NULL or not the current thread if `rt_mutex_take_interruptible` returns `-RT_ETIMEOUT`.
* - **Pass:** Both threads complete their loops and signal exit without asserting failure.
*
* Dependencies:
* - Hardware requirements (e.g., specific peripherals)
* - No specific hardware requirements.
* (This is met by the qemu-virt64-riscv BSP).
* - Software configuration (e.g., kernel options, driver initialization)
* - `RT_USING_UTEST` must be enabled (`RT-Thread Utestcases`).
* - `Scheduler Test` must be enabled (`RT-Thread Utestcases` -> `Kernel Core` -> 'Scheduler Test').
* - Environmental assumptions
* - No specific environmental assumptions.
* - Run the test case from the msh prompt:
* `utest_run core.scheduler_timed_mtx`
*
* Expected Results:
* - The test logs "Total failed times: X(in Y)" indicating valid timeouts handled correctly.
* - Final Output: `[ PASSED ] [ result ] testcase (core.scheduler_timed_mtx)`
*/
#define __RT_KERNEL_SOURCE__
#include <rtthread.h>
#include <stdlib.h>
+49
View File
@@ -6,7 +6,56 @@
* Change Logs:
* Date Author Notes
* 2024-01-25 Shell init ver.
* 2025-12-12 lhxj Add standardized utest documentation block
*/
/**
* Test Case Name: Scheduler Timed Semaphore Race Test (core.scheduler_timed_sem)
*
* Test Objectives:
* - Verify IPC (Semaphore) behavior under tight timing conditions (tick edge).
* - Stress test the race condition where a timeout routine and a producer thread
* race to wake up a sleeping consumer.
* - Ensure the scheduler handles interruptible semaphore takes correctly without
* returning unexpected error codes during high-contention/edge-case timing.
* - List specific functions or APIs to be tested:
* - rt_sem_take_interruptible
* - rt_sem_release
* - rt_tick_get
* - rt_thread_create
*
* Test Scenarios:
* - **Producer-Consumer Tick Edge Race:**
* 1. Initialize two semaphores (`_ipc_sem`, `_thr_exit_sem`).
* 2. Create two threads: a Producer (priority +1) and a Consumer (priority +1).
* 3. **Producer Loop:** Wait specifically for the RT-Thread tick count to change (tick edge),
* add a small random latency, and then release `_ipc_sem`.
* 4. **Consumer Loop:** Attempt to take `_ipc_sem` with a timeout of exactly 1 tick.
* 5. Track "failed times" (valid timeouts) versus "unexpected errors" (assert failure).
* 6. Run this loop for `TEST_SECONDS` (10 seconds).
*
* Verification Metrics:
* - **Pass:** The test completes the duration without triggering `uassert_true(0)`.
* - **Pass:** Consumer receives either `RT_EOK` (success) or `-RT_ETIMEOUT` (expected race loss).
* - **Fail:** Consumer receives any error code other than `RT_EOK` or `-RT_ETIMEOUT`.
*
* Dependencies:
* - Hardware requirements
* - No specific peripheral required.
* (This is met by the qemu-virt64-riscv BSP).
* - Software configuration
* - `RT_USING_UTEST` must be enabled (`RT-Thread Utestcases`).
* - `Scheduler Test` must be enabled (`RT-Thread Utestcases` -> `Kernel Core` -> 'Scheduler Test').
* - Environmental assumptions
* - System tick must be running.
* - Run the test case from the msh prompt:
* `utest_run core.scheduler_timed_sem`
*
* Expected Results:
* - The system logs "Total failed times: X(in Y)" (Timeouts are allowed/counted, not fatal).
* - Final Output: `[ PASSED ] [ result ] testcase (core.scheduler_timed_sem)`
*/
#define __RT_KERNEL_SOURCE__
#include <rtthread.h>
#include <stdlib.h>