The FreeRADIUS server $Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
Loading...
Searching...
No Matches
size_tests.c
Go to the documentation of this file.
1/*
2 * This library is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU Lesser General Public
4 * License as published by the Free Software Foundation; either
5 * version 2.1 of the License, or (at your option) any later version.
6 *
7 * This library is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 * Lesser General Public License for more details.
11 *
12 * You should have received a copy of the GNU Lesser General Public
13 * License along with this library; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
15 */
16
17/** Size printing/parsing
18 *
19 * @file src/lib/util/test//size_tests.c
20 * @copyright Arran Cudbard-Bell (a.cudbardb@freeradius.org)
21 */
22
23#include "acutest.h"
24#include"acutest_helpers.h"
25#include <freeradius-devel/util/size.h>
26
27/*
28fr_slen_t fr_size_from_str(size_t *out, fr_sbuff_t *in);
29
30fr_slen_t fr_size_to_str(fr_sbuff_t *out, size_t in);
31*/
32
33
34#define test_str(_str) &FR_SBUFF_IN_STR(_str)
35#define test_out(_buff) &FR_SBUFF_OUT(_buff, sizeof(_buff))
36
37static char buff[sizeof("18446744073709551615") + 3];
38
39static void test_size_parse_bytes(void)
40{
41 size_t size;
42
43 TEST_MSG("Parse zero b");
45 TEST_CHECK_LEN(size, 0);
46
47 TEST_MSG("Parse one b");
49 TEST_CHECK_LEN(size, 1);
50
51 TEST_MSG("Parse ten b");
53 TEST_CHECK_LEN(size, 10);
54
55 TEST_MSG("Parse max b");
56 snprintf(buff, sizeof(buff), "%zu", SIZE_MAX);
58 TEST_CHECK_LEN(size, SIZE_MAX);
59
60 TEST_MSG("Allow suffix b");
61 snprintf(buff, sizeof(buff), "%zub", SIZE_MAX);
63 TEST_CHECK_LEN(size, SIZE_MAX);
64
65 TEST_MSG("Allow trailing none-int");
66 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1b_")), 2);
67 TEST_CHECK_LEN(size, 1);
68
69 TEST_MSG("Fail on negative");
70 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("-10")), -1);
71
72/*
73 TEST_MSG("Fail on trailing");
74 TEST_CHECK_RET(fr_size_from_str(&size, test_str("1a0")), -2);
75*/
76}
77
79{
80 size_t size;
81
82 TEST_MSG("Parse zero ki");
83 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("0ki")), 3);
84 TEST_CHECK_LEN(size, 0);
85
86 TEST_MSG("Parse zero kib");
87 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("0kib")), 4);
88 TEST_CHECK_LEN(size, 0);
89
90 TEST_MSG("Parse one ki");
91 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1ki")), 3);
92 TEST_CHECK_LEN(size, 1024ULL);
93
94 TEST_MSG("Parse one kib");
95 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1kib")), 4);
96 TEST_CHECK_LEN(size, 1024ULL);
97
98 TEST_MSG("Parse one KIB");
99 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1KIB")), 4);
100 TEST_CHECK_LEN(size, 1024ULL);
101
102 TEST_MSG("Parse one mib");
103 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1mib")), 4);
104 TEST_CHECK_LEN(size, 1024ULL * 1024);
105
106 TEST_MSG("Parse one gib");
107 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1gib")), 4);
108 TEST_CHECK_LEN(size, 1024ULL * 1024 * 1024);
109
110 TEST_MSG("Parse one tib");
111 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1tib")), 4);
112 TEST_CHECK_LEN(size, 1024ULL * 1024 * 1024 * 1024);
113
114#if SIZE_MAX > UINT32_MAX
115 TEST_MSG("Parse one pib");
116 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1pib")), 4);
117 TEST_CHECK_LEN(size, 1024ULL * 1024 * 1024 * 1024 * 1024);
118
119 TEST_MSG("Parse one eib");
120 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1eib")), 4);
121 TEST_CHECK_LEN(size, 1024ULL * 1024 * 1024 * 1024 * 1024 * 1024);
122#endif
123
124 TEST_MSG("Overflow");
125 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("100000000eib")), -1);
126}
127
129{
130 size_t size;
131
132 TEST_MSG("Parse zero k");
133 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("0k")), 2);
134 TEST_CHECK_LEN(size, 0);
135
136 TEST_MSG("Parse zero kb");
137 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("0kb")), 3);
138 TEST_CHECK_LEN(size, 0);
139
140 TEST_MSG("Parse one k");
141 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1k")), 2);
142 TEST_CHECK_LEN(size, 1000ULL);
143
144 TEST_MSG("Parse one K");
145 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1K")), 2);
146 TEST_CHECK_LEN(size, 1000ULL);
147
148 TEST_MSG("Parse one KB");
149 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1KB")), 3);
150 TEST_CHECK_LEN(size, 1000ULL);
151
152 TEST_MSG("Parse one kb");
153 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1kb")), 3);
154 TEST_CHECK_LEN(size, 1000ULL);
155
156 TEST_MSG("Parse one mb");
157 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1mb")), 3);
158 TEST_CHECK_LEN(size, 1000ULL * 1000);
159
160 TEST_MSG("Parse one gb");
161 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1gb")), 3);
162 TEST_CHECK_LEN(size, 1000ULL * 1000 * 1000);
163
164 TEST_MSG("Parse one tb");
165 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1tb")), 3);
166 TEST_CHECK_LEN(size, 1000ULL * 1000 * 1000 * 1000);
167
168#if SIZE_MAX > UINT32_MAX
169 TEST_MSG("Parse one pb");
170 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1pb")), 3);
171 TEST_CHECK_LEN(size, 1000ULL * 1000 * 1000 * 1000 * 1000);
172
173 TEST_MSG("Parse one eb");
174 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("1eb")), 3);
175 TEST_CHECK_LEN(size, 1000ULL * 1000 * 1000 * 1000 * 1000 * 1000);
176#endif
177
178 TEST_MSG("Overflow");
179 TEST_CHECK_SLEN(fr_size_from_str(&size, test_str("100000000eb")), -1);
180}
181
182static void test_size_print_bytes(void)
183{
185 TEST_CHECK_STRCMP(buff, "1B");
186
188 TEST_CHECK_STRCMP(buff, "2B");
189
191 TEST_CHECK_STRCMP(buff, "3B");
192
194 TEST_CHECK_STRCMP(buff, "4B");
195
197 TEST_CHECK_STRCMP(buff, "5B");
198
200 TEST_CHECK_STRCMP(buff, "6B");
201
203 TEST_CHECK_STRCMP(buff, "7B");
204
206 TEST_CHECK_STRCMP(buff, "8B");
207
209 TEST_CHECK_STRCMP(buff, "9B");
210
212 TEST_CHECK_STRCMP(buff, "10B");
213
214 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)100), 4);
215 TEST_CHECK_STRCMP(buff, "100B");
216
217 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)999), 4);
218 TEST_CHECK_STRCMP(buff, "999B");
219
220 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1001), 5);
221 TEST_CHECK_STRCMP(buff, "1001B");
222
223 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1020), 5);
224 TEST_CHECK_STRCMP(buff, "1020B");
225
226 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1021), 5);
227 TEST_CHECK_STRCMP(buff, "1021B");
228
229 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1022), 5);
230 TEST_CHECK_STRCMP(buff, "1022B");
231
232 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1023), 5);
233 TEST_CHECK_STRCMP(buff, "1023B");
234
235 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1025), 5);
236 TEST_CHECK_STRCMP(buff, "1025B");
237
238 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1026), 5);
239 TEST_CHECK_STRCMP(buff, "1026B");
240
241 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1027), 5);
242 TEST_CHECK_STRCMP(buff, "1027B");
243
244 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1028), 5);
245 TEST_CHECK_STRCMP(buff, "1028B");
246
247 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1029), 5);
248 TEST_CHECK_STRCMP(buff, "1029B");
249
250 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1030), 5);
251 TEST_CHECK_STRCMP(buff, "1030B");
252}
253
254static void test_size_print_base2(void)
255{
256 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1024), 4);
257 TEST_CHECK_STRCMP(buff, "1KiB");
258
259 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1024 * 1024), 4);
260 TEST_CHECK_STRCMP(buff, "1MiB");
261
262 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1024 * 1024 * 1024), 4);
263 TEST_CHECK_STRCMP(buff, "1GiB");
264
265 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1024 * 1024 * 1024 * 1024), 4);
266 TEST_CHECK_STRCMP(buff, "1TiB");
267
268#if SIZE_MAX > UINT32_MAX
269 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1024 * 1024 * 1024 * 1024 * 1024), 4);
270 TEST_CHECK_STRCMP(buff, "1PiB");
271
272 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1024 * 1024 * 1024 * 1024 * 1024 * 1024), 4);
273 TEST_CHECK_STRCMP(buff, "1EiB");
274#endif
275
276 TEST_MSG("Fall back to KiB");
277 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), ((size_t)1024 * 1024 * 1024 * 1024) + 1024), 13);
278 TEST_CHECK_STRCMP(buff, "1073741825KiB");
279
280 TEST_MSG("Fall back to B");
281 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), ((size_t)1024 * 1024 * 1024 * 1024) + 1025), 14);
282 TEST_CHECK_STRCMP(buff, "1099511628801B");
283
284 /* Regression - Was displayed as 524288KB because it took the base 10 path */
285 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)524288000), 6);
286 TEST_CHECK_STRCMP(buff, "500MiB");
287}
288
289static void test_size_print_base10(void)
290{
291 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1000), 3);
292 TEST_CHECK_STRCMP(buff, "1KB");
293
294 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1000 * 1000), 3);
295 TEST_CHECK_STRCMP(buff, "1MB");
296
297 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1000 * 1000 + 64000), 6);
298 TEST_CHECK_STRCMP(buff, "1064KB");
299
300 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1000 * 1000 * 1000), 3);
301 TEST_CHECK_STRCMP(buff, "1GB");
302
303 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1000 * 1000 * 1000 * 1000), 3);
304 TEST_CHECK_STRCMP(buff, "1TB");
305
306#if SIZE_MAX > UINT32_MAX
307 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1000 * 1000 * 1000 * 1000 * 1000), 3);
308 TEST_CHECK_STRCMP(buff, "1PB");
309
310 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), (size_t)1000 * 1000 * 1000 * 1000 * 1000 * 1000), 3);
311 TEST_CHECK_STRCMP(buff, "1EB");
312#endif
313
314 TEST_MSG("Fall back to KB");
315 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), ((size_t)1000 * 1000 * 1000 * 1000) + 1000), 12);
316 TEST_CHECK_STRCMP(buff, "1000000001KB");
317
318 TEST_MSG("Fall back to B");
319 TEST_CHECK_SLEN(fr_size_to_str(test_out(buff), ((size_t)1000 * 1000 * 1000 * 1000) + 1025), 14);
320 TEST_CHECK_STRCMP(buff, "1000000001025B");
321}
322
324 /*
325 * Allocation and management
326 */
327 { "parse_bytes", test_size_parse_bytes },
328 { "parse_suffix_base2", test_size_parse_suffix_base2 },
329 { "parse_suffix_base10", test_size_parse_suffix_base10 },
330
331 { "print_bytes", test_size_print_bytes },
332 { "print_base2", test_size_print_base2 },
333 { "print_base10", test_size_print_base10 },
334
336};
#define TEST_TERMINATOR
Definition acutest.h:64
#define TEST_MSG(...)
Definition acutest.h:217
#define TEST_CHECK_SLEN(_got, _exp)
#define TEST_CHECK_LEN(_got, _exp)
#define TEST_CHECK_STRCMP(_got, _exp)
long int ssize_t
fr_slen_t fr_size_from_str(size_t *out, fr_sbuff_t *in)
Parse a size string with optional unit.
Definition size.c:40
fr_slen_t fr_size_to_str(fr_sbuff_t *out, size_t in)
Print a size string with unit.
Definition size.c:155
static void test_size_print_base2(void)
Definition size_tests.c:254
TEST_LIST
Definition size_tests.c:323
static void test_size_parse_bytes(void)
Definition size_tests.c:39
static void test_size_print_bytes(void)
Definition size_tests.c:182
static void test_size_parse_suffix_base10(void)
Definition size_tests.c:128
static char buff[sizeof("18446744073709551615")+3]
Definition size_tests.c:37
static void test_size_print_base10(void)
Definition size_tests.c:289
#define test_out(_buff)
Definition size_tests.c:35
static void test_size_parse_suffix_base2(void)
Definition size_tests.c:78
#define test_str(_str)
Definition size_tests.c:34
PUBLIC int snprintf(char *string, size_t length, char *format, va_alist)
Definition snprintf.c:689