blob: 1247577d081f71758c782a1f0da5adc0d5dc613d [file] [log] [blame]
Jakub Czapiga7a940df2021-02-15 12:07:10 +01001/* 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
11struct memset_test_state {
12 u8 *base_buffer;
13 u8 *helper_buffer;
14};
15
16static int setup_test(void **state)
17{
18 struct memset_test_state *s = malloc(sizeof(struct memset_test_state));
19
20 u8 *buf = malloc(MEMSET_BUFFER_SZ);
21 u8 *helper_buf = malloc(MEMSET_BUFFER_SZ);
22 if (!buf || !helper_buf)
23 goto error;
24
25 s->base_buffer = buf;
26 s->helper_buffer = helper_buf;
27 *state = s;
28
29 return 0;
30
31error:
32 free(buf);
33 free(helper_buf);
34 return -1;
35}
36
37static 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
51static 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
62static 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
78static 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
92static 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
106int main(void)
107{
108 const struct CMUnitTest tests[] = {
109 cmocka_unit_test_setup_teardown(test_memset_full_range,
110 setup_test, teardown_test),
111 cmocka_unit_test_setup_teardown(test_memset_subrange,
112 setup_test, teardown_test),
113 cmocka_unit_test_setup_teardown(test_memset_zero_size,
114 setup_test, teardown_test),
115 cmocka_unit_test_setup_teardown(test_memset_one_byte,
116 setup_test, teardown_test),
117 };
118
119 return cmocka_run_group_tests(tests, NULL, NULL);
120}