|
8 | 8 | * 2025-07-18 kurisaW First commit |
9 | 9 | * 2025-11-13 CYFS Add standardized documentation block for object_tc |
10 | 10 | * 2025-11-19 Rbb666 Refactor tests, add stress and error-path coverage |
| 11 | + * 2025-12-12 CYFS add strict name-check tests |
11 | 12 | */ |
12 | 13 |
|
13 | 14 | /** |
@@ -140,6 +141,30 @@ static rt_err_t generate_unique_name(char *buf, |
140 | 141 | return -RT_ENOMEM; |
141 | 142 | } |
142 | 143 |
|
| 144 | +#if defined(RT_USING_STRICT_NAME_CHECKS) && defined(RT_DEBUGING_ASSERT) |
| 145 | +struct strict_assert_capture |
| 146 | +{ |
| 147 | + rt_bool_t armed; |
| 148 | + rt_uint16_t hit_count; |
| 149 | + const char *expr; |
| 150 | + const char *func; |
| 151 | + rt_size_t line; |
| 152 | +}; |
| 153 | + |
| 154 | +static struct strict_assert_capture strict_assert_capture_state; |
| 155 | + |
| 156 | +static void strict_assert_hook(const char *ex, const char *func, rt_size_t line) |
| 157 | +{ |
| 158 | + if (!strict_assert_capture_state.armed) |
| 159 | + return; |
| 160 | + |
| 161 | + strict_assert_capture_state.hit_count++; |
| 162 | + strict_assert_capture_state.expr = ex; |
| 163 | + strict_assert_capture_state.func = func; |
| 164 | + strict_assert_capture_state.line = line; |
| 165 | +} |
| 166 | +#endif /* defined(RT_USING_STRICT_NAME_CHECKS) && defined(RT_DEBUGING_ASSERT) */ |
| 167 | + |
143 | 168 | static void test_object_name_handling(void) |
144 | 169 | { |
145 | 170 | struct rt_object static_obj; |
@@ -415,6 +440,57 @@ static void test_object_error_paths(void) |
415 | 440 | rt_object_detach(&obj); |
416 | 441 | } |
417 | 442 |
|
| 443 | +#if defined(RT_USING_STRICT_NAME_CHECKS) && defined(RT_DEBUGING_ASSERT) |
| 444 | +static void test_object_strict_name_checks(void) |
| 445 | +{ |
| 446 | + struct rt_object base_obj; |
| 447 | + struct rt_object duplicate_obj; |
| 448 | + struct rt_object overflow_obj; |
| 449 | + char duplicate_name[TEST_RT_NAME_MAX]; |
| 450 | + char overflow_name[TEST_RT_NAME_MAX + 8]; |
| 451 | + rt_size_t base_len; |
| 452 | + void (*prev_hook)(const char *, const char *, rt_size_t) = rt_assert_hook; |
| 453 | + |
| 454 | + uassert_true(generate_unique_name(duplicate_name, sizeof(duplicate_name), "strict", RT_Object_Class_Thread) == RT_EOK); |
| 455 | + rt_object_init(&base_obj, RT_Object_Class_Thread, duplicate_name); |
| 456 | + |
| 457 | + rt_assert_set_hook(strict_assert_hook); |
| 458 | + |
| 459 | + strict_assert_capture_state.hit_count = 0; |
| 460 | + strict_assert_capture_state.expr = RT_NULL; |
| 461 | + strict_assert_capture_state.func = RT_NULL; |
| 462 | + strict_assert_capture_state.line = 0; |
| 463 | + strict_assert_capture_state.armed = RT_TRUE; |
| 464 | + rt_object_init(&duplicate_obj, RT_Object_Class_Thread, duplicate_name); |
| 465 | + uassert_true(strict_assert_capture_state.hit_count >= 1); |
| 466 | + uassert_not_null(strict_assert_capture_state.expr); |
| 467 | + uassert_str_equal(strict_assert_capture_state.expr, "duplicate == RT_NULL"); |
| 468 | + strict_assert_capture_state.armed = RT_FALSE; |
| 469 | + rt_object_detach(&duplicate_obj); |
| 470 | + |
| 471 | + uassert_true(generate_unique_name(overflow_name, sizeof(overflow_name), "strict", RT_Object_Class_Thread) == RT_EOK); |
| 472 | + base_len = rt_strlen(overflow_name); |
| 473 | + rt_memset(overflow_name + base_len, 'x', sizeof(overflow_name) - base_len - 1); |
| 474 | + overflow_name[sizeof(overflow_name) - 1] = '\0'; |
| 475 | + uassert_true(rt_strlen(overflow_name) > TEST_RT_NAME_MAX - 1); |
| 476 | + |
| 477 | + strict_assert_capture_state.hit_count = 0; |
| 478 | + strict_assert_capture_state.expr = RT_NULL; |
| 479 | + strict_assert_capture_state.func = RT_NULL; |
| 480 | + strict_assert_capture_state.line = 0; |
| 481 | + strict_assert_capture_state.armed = RT_TRUE; |
| 482 | + rt_object_init(&overflow_obj, RT_Object_Class_Thread, overflow_name); |
| 483 | + uassert_true(strict_assert_capture_state.hit_count >= 1); |
| 484 | + uassert_not_null(strict_assert_capture_state.expr); |
| 485 | + uassert_str_equal(strict_assert_capture_state.expr, "obj_name_len <= RT_NAME_MAX - 1"); |
| 486 | + strict_assert_capture_state.armed = RT_FALSE; |
| 487 | + rt_object_detach(&overflow_obj); |
| 488 | + |
| 489 | + rt_assert_set_hook(prev_hook); |
| 490 | + rt_object_detach(&base_obj); |
| 491 | +} |
| 492 | +#endif /* defined(RT_USING_STRICT_NAME_CHECKS) && defined(RT_DEBUGING_ASSERT) */ |
| 493 | + |
418 | 494 | #ifdef RT_USING_HEAP |
419 | 495 | static rt_err_t custom_destroy_cb(void *data) |
420 | 496 | { |
@@ -516,6 +592,9 @@ static void test_object_suite(void) |
516 | 592 | UTEST_UNIT_RUN(test_object_error_paths); |
517 | 593 | #ifdef RT_USING_HEAP |
518 | 594 | UTEST_UNIT_RUN(test_custom_object_lifecycle); |
| 595 | +#endif |
| 596 | +#if defined(RT_USING_STRICT_NAME_CHECKS) && defined(RT_DEBUGING_ASSERT) |
| 597 | + UTEST_UNIT_RUN(test_object_strict_name_checks); |
519 | 598 | #endif |
520 | 599 | UTEST_UNIT_RUN(test_object_pressure); |
521 | 600 | } |
|
0 commit comments