1 /*
2  * Copyright (c) 2006-2024, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author             Notes
8  * 2020-05-06     Phillip Johnston   the first version
9  * 2024-12-24     Meco Man           port to utest
10  */
11 
12 #include <rtthread.h>
13 #include <utest.h>
14 
15 #define TEST_BUF_SIZE 400
16 
17 static char *buf;
18 static char *buf2;
19 
utest_tc_init(void)20 static rt_err_t utest_tc_init(void)
21 {
22     buf = rt_malloc(TEST_BUF_SIZE * sizeof(char));
23     uassert_not_null(buf);
24     buf2 = rt_malloc(TEST_BUF_SIZE * sizeof(char));
25     uassert_not_null(buf2);
26     return RT_EOK;
27 }
28 
utest_tc_cleanup(void)29 static rt_err_t utest_tc_cleanup(void)
30 {
31     rt_free(buf);
32     rt_free(buf2);
33     return RT_EOK;
34 }
35 
test_align(int align,size_t len)36 static void test_align(int align, size_t len)
37 {
38     char *s = (char *)RT_ALIGN(((rt_ubase_t)buf + 64), 64) + align;
39     char *want = (char *)RT_ALIGN(((rt_ubase_t)buf2 + 64), 64) + align;
40     char *p;
41     int i;
42 
43     uassert_false(len + 64 > (size_t)(buf + TEST_BUF_SIZE - s));
44     uassert_false(len + 64 > (size_t)(buf2 + TEST_BUF_SIZE - want));
45 
46     for(i = 0; i < TEST_BUF_SIZE; i++)
47     {
48         buf[i] = buf2[i] = ' ';
49     }
50 
51     for(i = 0; i < (int)len; i++)
52     {
53         want[i] = '#';
54     }
55 
56     p = rt_memset(s, '#', len);
57 
58     uassert_ptr_equal(p, s);
59 
60     for(i = -64; i < (int)len + 64; i++)
61     {
62         uassert_int_equal(s[i], want[i]);
63     }
64 }
65 
TC_rt_memcpy_align(void)66 static void TC_rt_memcpy_align(void)
67 {
68     for(int i = 0; i < 16; i++)
69     {
70         for(size_t j = 0; j < 200; j++)
71         {
72             test_align(i, j);
73         }
74     }
75 }
76 
test_input(char c)77 static void test_input(char c)
78 {
79     rt_memset(buf, c, 10);
80     for(int i = 0; i < 10; i++)
81     {
82         uassert_int_equal(buf[i], c);
83     }
84 }
85 
TC_rt_memcpy_input(void)86 static void TC_rt_memcpy_input(void)
87 {
88     test_input('c');
89     test_input(0);
90     test_input(-1);
91     test_input(0xab);
92     test_input((char)RT_UINT32_MAX);
93     test_input((char)-RT_UINT32_MAX);
94 }
95 
utest_do_tc(void)96 static void utest_do_tc(void)
97 {
98     UTEST_UNIT_RUN(TC_rt_memcpy_align);
99     UTEST_UNIT_RUN(TC_rt_memcpy_input);
100 }
101 
102 UTEST_TC_EXPORT(utest_do_tc, "klibc.rt_memset", utest_tc_init, utest_tc_cleanup, 1000);
103