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