xref: /aosp_15_r20/external/coreboot/tests/lib/memset-test.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <stdlib.h>
4 #include <tests/test.h>
5 #include <commonlib/helpers.h>
6 #include <types.h>
7 #include <string.h>
8 
9 #define MEMSET_BUFFER_SZ (4 * KiB)
10 
11 struct memset_test_state {
12 	u8 *base_buffer;
13 	u8 *helper_buffer;
14 };
15 
setup_test(void ** state)16 static int setup_test(void **state)
17 {
18 	struct memset_test_state *s = malloc(sizeof(struct memset_test_state));
19 	u8 *buf = malloc(MEMSET_BUFFER_SZ);
20 	u8 *helper_buf = malloc(MEMSET_BUFFER_SZ);
21 	if (!s || !buf || !helper_buf)
22 		goto error;
23 
24 	s->base_buffer = buf;
25 	s->helper_buffer = helper_buf;
26 	*state = s;
27 
28 	return 0;
29 
30 error:
31 	free(buf);
32 	free(helper_buf);
33 	free(s);
34 	return -1;
35 }
36 
teardown_test(void ** state)37 static int teardown_test(void **state)
38 {
39 	struct memset_test_state *s = *state;
40 
41 	if (s) {
42 		free(s->base_buffer);
43 		free(s->helper_buffer);
44 	}
45 
46 	free(s);
47 
48 	return 0;
49 }
50 
test_memset_full_range(void ** state)51 static void test_memset_full_range(void **state)
52 {
53 	struct memset_test_state *s = *state;
54 
55 	for (int i = 0; i < MEMSET_BUFFER_SZ; ++i)
56 		s->helper_buffer[i] = 0x42;
57 
58 	memset(s->base_buffer, 0x42, MEMSET_BUFFER_SZ);
59 	assert_memory_equal(s->base_buffer, s->helper_buffer, MEMSET_BUFFER_SZ);
60 }
61 
test_memset_subrange(void ** state)62 static void test_memset_subrange(void **state)
63 {
64 	struct memset_test_state *s = *state;
65 	int i = 0;
66 
67 	for (; i < MEMSET_BUFFER_SZ / 2; ++i)
68 		s->helper_buffer[i] = 0xEF;
69 	for (; i < MEMSET_BUFFER_SZ; ++i)
70 		s->helper_buffer[i] = 0xCD;
71 
72 	/* Expect correct buffer subranges to be filled */
73 	memset(s->base_buffer, 0xEF, MEMSET_BUFFER_SZ / 2);
74 	memset(s->base_buffer + MEMSET_BUFFER_SZ / 2, 0xCD, MEMSET_BUFFER_SZ / 2);
75 	assert_memory_equal(s->base_buffer, s->helper_buffer, MEMSET_BUFFER_SZ);
76 }
77 
test_memset_zero_size(void ** state)78 static void test_memset_zero_size(void **state)
79 {
80 	struct memset_test_state *s = *state;
81 
82 	for (int i = 0; i < MEMSET_BUFFER_SZ; ++i) {
83 		s->base_buffer[i] = 0xFF;
84 		s->helper_buffer[i] = 0xFF;
85 	}
86 
87 	/* Expect no change in buffer after calling memset with zero size */
88 	memset(s->base_buffer, 0xAA, (0));
89 	assert_memory_equal(s->base_buffer, s->helper_buffer, MEMSET_BUFFER_SZ);
90 }
91 
test_memset_one_byte(void ** state)92 static void test_memset_one_byte(void **state)
93 {
94 	struct memset_test_state *s = *state;
95 
96 	for (int i = 0; i < MEMSET_BUFFER_SZ; ++i) {
97 		s->base_buffer[i] = 0x66;
98 		s->helper_buffer[i] = 0x66;
99 	}
100 
101 	s->helper_buffer[MEMSET_BUFFER_SZ / 4] = 0xCC;
102 	memset(&s->base_buffer[MEMSET_BUFFER_SZ / 4], 0xCC, 1);
103 	assert_memory_equal(s->base_buffer, s->helper_buffer, MEMSET_BUFFER_SZ);
104 }
105 
main(void)106 int main(void)
107 {
108 	const struct CMUnitTest tests[] = {
109 		cmocka_unit_test_setup_teardown(test_memset_full_range, setup_test,
110 						teardown_test),
111 		cmocka_unit_test_setup_teardown(test_memset_subrange, setup_test,
112 						teardown_test),
113 		cmocka_unit_test_setup_teardown(test_memset_zero_size, setup_test,
114 						teardown_test),
115 		cmocka_unit_test_setup_teardown(test_memset_one_byte, setup_test,
116 						teardown_test),
117 	};
118 
119 	return cb_run_group_tests(tests, NULL, NULL);
120 }
121