mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-08-20 21:29:42 +08:00
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
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:
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user