Skip to content

Commit 14ee1cc

Browse files
committed
cm: Add unittests for libcm
Also includes: * TODO updates
1 parent 126038f commit 14ee1cc

File tree

4 files changed

+240
-2
lines changed

4 files changed

+240
-2
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ else()
187187

188188
add_custom_target(build-all ALL)
189189
add_subdirectory(src/unittests/kernel)
190+
add_subdirectory(src/unittests/cm)
190191

191192
#---------------------------------------------------------------------------
192193
# Generage unittest coverage report

docs/notes/TODO.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
| [X] unittest.h bug: | | 20 JUL 23 |
1515
| Function under test is called twice when a scalar match fails. | | |
1616
| [X] Utils unittest | 09 JAN 24 | 09 JAN 24 |
17+
| [X] libcm unittest | Nov 24 | 21 Nov 24 |
1718
|-------------------------------------------------------------------------|-----------|------------|
1819
| DOCUMENTATION | | |
1920
|-------------------------------------------------------------------------|-----------|------------|
@@ -118,9 +119,9 @@
118119
| [X] k_panic in graphics mode - Need to have very low dependency. May be | 13 Nov 24 | 17 Nov 24 |
119120
| have to draw directly to video frame buffer | | |
120121
|-------------------------------------------------------------------------|-----------|------------|
121-
| APP LIB | | |
122+
| LIBC MOS | | |
122123
|-------------------------------------------------------------------------|-----------|------------|
123-
| [ ] APPLIB is just a terrible name. | 13 Nov 24 | |
124+
| [X] APPLIB is just a terrible name. | 13 Nov 24 | 21 Nov 24 |
124125
|-------------------------------------------------------------------------|-----------|------------|
125126
| [ ] Process events need to be handled such that no event gets lost. | 13 Nov 24 | |
126127
| Sort of what Windows | | |

src/unittests/cm/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
include(${PROJECT_SOURCE_DIR}/src/mock/mockfortests_${ARCH}.cmake)
2+
3+
test(
4+
NAME cm_printf_test
5+
DEPENDENT_FOR build-all
6+
SOURCES
7+
${PROJECT_SOURCE_DIR}/src/cm/printf.c
8+
${PROJECT_SOURCE_DIR}/src/unittests/unittest.c
9+
${CMAKE_CURRENT_SOURCE_DIR}/printf_test.c
10+
)

src/unittests/cm/printf_test.c

Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
#include <unittest/unittest.h>
2+
#include <types.h>
3+
#include <moslimits.h>
4+
#include <kdebug.h>
5+
#include <string.h>
6+
#include <stdio.h>
7+
#include <utils.h>
8+
#include <kernel.h>
9+
10+
TEST(snprintf, no_vargs)
11+
{
12+
#define MESSAGE "Hello world"
13+
CHAR d[MAX_PRINTABLE_STRING_LENGTH];
14+
INT ret = snprintf (d, ARRAY_LENGTH(d), MESSAGE);
15+
EQ_SCALAR(ret, 11);
16+
EQ_SCALAR(ret, strlen(MESSAGE));
17+
EQ_STRING(d, MESSAGE);
18+
END();
19+
}
20+
21+
TEST(snprintf, unsigned_int_bit_format)
22+
{
23+
INT num = 0xFF01;
24+
CHAR d[MAX_PRINTABLE_STRING_LENGTH];
25+
INT ret = snprintf (d, ARRAY_LENGTH(d), "%b", num);
26+
EQ_SCALAR(ret, 17);
27+
EQ_STRING(d, "1111111100000001b");
28+
END();
29+
}
30+
31+
TEST(snprintf, unsigned_int_decimal_format)
32+
{
33+
INT num = 1045;
34+
CHAR d[MAX_PRINTABLE_STRING_LENGTH];
35+
INT ret = snprintf (d, ARRAY_LENGTH(d), "%u", num);
36+
EQ_SCALAR(ret, 4);
37+
EQ_STRING(d, "1045");
38+
END();
39+
}
40+
41+
TEST(snprintf, unsigned_int_hex_format_without_base_identifier)
42+
{
43+
INT num = 0x123def;
44+
CHAR d[MAX_PRINTABLE_STRING_LENGTH];
45+
INT ret = snprintf (d, ARRAY_LENGTH(d), "%h", num);
46+
EQ_SCALAR(ret, 6);
47+
EQ_STRING(d, "123DEF");
48+
END();
49+
}
50+
51+
TEST(snprintf, unsigned_int_hex_format)
52+
{
53+
INT num = 0x123def;
54+
CHAR d[MAX_PRINTABLE_STRING_LENGTH];
55+
INT ret = snprintf (d, ARRAY_LENGTH(d), "%x", num);
56+
EQ_SCALAR(ret, 7);
57+
EQ_STRING(d, "123DEFh");
58+
END();
59+
}
60+
61+
TEST(snprintf, unsigned_int_octal_format)
62+
{
63+
INT num = 07210;
64+
CHAR d[MAX_PRINTABLE_STRING_LENGTH];
65+
INT ret = snprintf (d, ARRAY_LENGTH(d), "%o", num);
66+
EQ_SCALAR(ret, 5);
67+
EQ_STRING(d, "7210o");
68+
END();
69+
}
70+
71+
TEST(snprintf, unsigned_long_hex_format)
72+
{
73+
U32 num = 0xCF010203;
74+
CHAR d[MAX_PRINTABLE_STRING_LENGTH];
75+
INT ret = snprintf (d, ARRAY_LENGTH(d), "%lx", num);
76+
EQ_SCALAR(ret, 9);
77+
EQ_STRING(d, "CF010203h");
78+
END();
79+
}
80+
TEST(snprintf, unsigned_long_long_hex_format)
81+
{
82+
U64 num = 0xCF010203040506FF;
83+
CHAR d[MAX_PRINTABLE_STRING_LENGTH];
84+
INT ret = snprintf (d, ARRAY_LENGTH(d), "%llx", num);
85+
EQ_SCALAR(ret, 17);
86+
EQ_STRING(d, "CF010203040506FFh");
87+
END();
88+
}
89+
90+
TEST(snprintf, limit_check_empty_string)
91+
{
92+
CHAR *message = "";
93+
CHAR d[1];
94+
INT ret = snprintf (d, ARRAY_LENGTH(d), "%s", message);
95+
EQ_SCALAR(ret, 0);
96+
EQ_STRING(d, "");
97+
END();
98+
}
99+
100+
TEST(snprintf, limit_check_at_edge)
101+
{
102+
CHAR *message = "aaa"; // 3 'a's. NULL at index 3.
103+
CHAR d[4];
104+
105+
INT ret = snprintf (d, ARRAY_LENGTH(d), "%s", message);
106+
EQ_SCALAR(ret, 3);
107+
EQ_STRING(d, message);
108+
END();
109+
}
110+
111+
TEST(snprintf, limit_check_overflow_literal)
112+
{
113+
#define MESSAGE "Hello world"
114+
CHAR d[8];
115+
INT ret = snprintf (d, ARRAY_LENGTH(d), MESSAGE);
116+
EQ_SCALAR(ret, 11);
117+
EQ_STRING(d, "Hello w");
118+
END();
119+
}
120+
121+
TEST(snprintf, limit_check_overflow_string_format)
122+
{
123+
CHAR *message = "Hello world";
124+
CHAR d[8];
125+
INT ret = snprintf (d, ARRAY_LENGTH(d), "%s", message);
126+
EQ_SCALAR(ret, 11);
127+
EQ_STRING(d, "Hello w");
128+
END();
129+
}
130+
131+
TEST(snprintf, limit_check_overflow_unsigned_int)
132+
{
133+
INT num = 0xFF012EA;
134+
CHAR d[4];
135+
INT ret = snprintf (d, ARRAY_LENGTH(d), "%x", num);
136+
EQ_SCALAR(ret, 8);
137+
EQ_STRING(d, "FF0");
138+
END();
139+
}
140+
141+
TEST(snprintf, limit_check_overflow_mixed)
142+
{
143+
INT num = 0xFF012EA;
144+
CHAR d[15];
145+
INT ret = snprintf (d, ARRAY_LENGTH(d), "Hello %s %x",
146+
"World", num);
147+
EQ_SCALAR(ret, 20);
148+
EQ_STRING(d, "Hello World FF");
149+
END();
150+
}
151+
152+
TEST(snprintf, percent_symbol)
153+
{
154+
CHAR d[MAX_PRINTABLE_STRING_LENGTH];
155+
INT ret = snprintf (d, ARRAY_LENGTH(d), "100%%");
156+
EQ_SCALAR(ret, 4);
157+
EQ_STRING(d, "100%");
158+
END();
159+
}
160+
161+
TEST(snprintf, wrong_format)
162+
{
163+
// %a is not a valid format. snprintf should treat this to be a literal.
164+
CHAR d[MAX_PRINTABLE_STRING_LENGTH];
165+
INT ret = snprintf (d, ARRAY_LENGTH(d), "Hello %arjob");
166+
EQ_SCALAR(ret, 12);
167+
EQ_STRING(d, "Hello %arjob");
168+
END();
169+
}
170+
171+
TEST(snprintf, string_literal)
172+
{
173+
CHAR d[MAX_PRINTABLE_STRING_LENGTH];
174+
INT ret = snprintf (d, ARRAY_LENGTH(d), "Arjob 0x10A");
175+
EQ_SCALAR(ret, 11);
176+
EQ_STRING(d, "Arjob 0x10A");
177+
END();
178+
}
179+
180+
TEST(snprintf, memory_overlap)
181+
{
182+
CHAR d[MAX_PRINTABLE_STRING_LENGTH];
183+
INT ret1 = snprintf (d, ARRAY_LENGTH(d), "Hello");
184+
INT ret2 = snprintf (d, ARRAY_LENGTH(d), "%s World", d);
185+
EQ_SCALAR(ret1, 5);
186+
EQ_SCALAR(ret2, 5 + 1 + 5);
187+
EQ_STRING(d, "Hello World");
188+
END();
189+
}
190+
191+
TEST(snprintf, pointer_literal)
192+
{
193+
USYSINT num = 0xFF012EA;
194+
CHAR d[10];
195+
INT ret = snprintf (d, ARRAY_LENGTH(d), "%px", num);
196+
EQ_SCALAR(ret, 8);
197+
EQ_STRING(d, "FF012EAh");
198+
END();
199+
}
200+
201+
void reset()
202+
{
203+
}
204+
205+
int main()
206+
{
207+
no_vargs();
208+
unsigned_int_hex_format();
209+
unsigned_int_hex_format_without_base_identifier();
210+
unsigned_int_decimal_format();
211+
unsigned_int_octal_format();
212+
unsigned_long_long_hex_format();
213+
unsigned_long_hex_format();
214+
unsigned_int_bit_format();
215+
percent_symbol();
216+
string_literal();
217+
wrong_format();
218+
limit_check_overflow_literal();
219+
limit_check_overflow_string_format();
220+
limit_check_overflow_unsigned_int();
221+
limit_check_overflow_mixed();
222+
limit_check_empty_string();
223+
limit_check_at_edge();
224+
memory_overlap();
225+
pointer_literal();
226+
}

0 commit comments

Comments
 (0)