blob: b0be91f4772bb587f2d3deed7c9b968b67a8f32f [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));
Jakub Czapiga7a940df2021-02-15 12:07:10 +010019 u8 *buf = malloc(MEMSET_BUFFER_SZ);
20 u8 *helper_buf = malloc(MEMSET_BUFFER_SZ);
Jakub Czapiga5ab67f92021-05-24 13:33:07 +020021 if (!s || !buf || !helper_buf)
Jakub Czapiga7a940df2021-02-15 12:07:10 +010022 goto error;
23
24 s->base_buffer = buf;
25 s->helper_buffer = helper_buf;
26 *state = s;
27
28 return 0;
29
30error:
31 free(buf);
32 free(helper_buf);
Jakub Czapiga5ab67f92021-05-24 13:33:07 +020033 free(s);
Jakub Czapiga7a940df2021-02-15 12:07:10 +010034 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 */
Julius Wernerd4863a52021-03-17 17:49:56 -070088 memset(s->base_buffer, 0xAA, (0));
Jakub Czapiga7a940df2021-02-15 12:07:10 +010089 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[] = {
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000109 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),
Jakub Czapiga7a940df2021-02-15 12:07:10 +0100117 };
118
Jakub Czapiga7c6081e2021-08-25 16:27:35 +0200119 return cb_run_group_tests(tests, NULL, NULL);
Jakub Czapiga7a940df2021-02-15 12:07:10 +0100120}