-
Notifications
You must be signed in to change notification settings - Fork 6.8k
/
main.c
134 lines (118 loc) · 3.9 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
* Copyright (c) 2021 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <ztest.h>
#include <sys/cbprintf.h>
#define CBPRINTF_DEBUG 1
struct out_buffer {
char *buf;
size_t idx;
size_t size;
};
static int out(int c, void *dest)
{
int rv = EOF;
struct out_buffer *buf = dest;
if (buf->idx < buf->size) {
buf->buf[buf->idx++] = (char)(unsigned char)c;
rv = (int)(unsigned char)c;
}
return rv;
}
static char static_buf[512];
static char runtime_buf[512];
static char compare_buf[128];
void dump(const char *desc, uint8_t *package, size_t len)
{
printk("%s package %p:\n", desc, package);
for (size_t i = 0; i < len; i++) {
printk("%02x ", package[i]);
}
printk("\n");
}
void unpack(const char *desc, struct out_buffer *buf,
uint8_t *package, size_t len)
{
cbpprintf(out, buf, package);
buf->buf[buf->idx] = 0;
zassert_equal(strcmp(buf->buf, compare_buf), 0,
"Strings differ\nexp: |%s|\ngot: |%s|\n",
compare_buf, buf->buf);
}
#define TEST_PACKAGING(fmt, ...) do { \
snprintf(compare_buf, sizeof(compare_buf), fmt, __VA_ARGS__); \
printk("-----------------------------------------\n"); \
printk("%s\n", compare_buf); \
struct out_buffer rt_buf = { \
.buf = runtime_buf, .idx = 0, .size = sizeof(runtime_buf) \
}; \
int rc = cbprintf_package(NULL, 0, fmt, __VA_ARGS__); \
zassert_true(rc > 0, "cbprintf_package() returned %d", rc); \
int len = rc; \
/* Aligned so the package is similar to the static one. */ \
uint8_t __aligned(CBPRINTF_PACKAGE_ALIGNMENT) rt_package[len]; \
memset(rt_package, 0, len); \
rc = cbprintf_package(rt_package, len, fmt, __VA_ARGS__); \
zassert_equal(rc, len, "cbprintf_package() returned %d, expected %d", rc, len); \
dump("runtime", rt_package, len); \
unpack("runtime", &rt_buf, rt_package, len); \
\
struct out_buffer st_buf = { \
.buf = static_buf, .idx = 0, .size = sizeof(static_buf) \
}; \
CBPRINTF_STATIC_PACKAGE(NULL, 0, len, fmt, __VA_ARGS__); \
uint8_t __aligned(CBPRINTF_PACKAGE_ALIGNMENT) package[len]; \
CBPRINTF_STATIC_PACKAGE(package, len, len, fmt, __VA_ARGS__); \
dump("static", package, len); \
unpack("static", &st_buf, package, len); \
} while (0)
void test_cbprintf_package(void)
{
volatile signed char sc = -11;
int i = 100;
char c = 'a';
static const short s = -300;
long li = -1111111111;
long long lli = 0x1122334455667788;
unsigned char uc = 100;
unsigned int ui = 0x12345;
unsigned short us = 0x1234;
unsigned long ul = 0xaabbaabb;
unsigned long long ull = 0xaabbaabbaabb;
float f = -1.234;
double d = 1.2333;
/* tests to exercize different element alignments */
TEST_PACKAGING("test long %x %lx %x", 0xb1b2b3b4, li, 0xe4e3e2e1);
TEST_PACKAGING("test long long %x %llx %x", 0xb1b2b3b4, lli, 0xe4e3e2e1);
if (IS_ENABLED(CONFIG_CBPRINTF_FP_SUPPORT)) {
TEST_PACKAGING("test double %x %f %x", 0xb1b2b3b4, d, 0xe4e3e2e1);
}
/* tests with varied elements */
TEST_PACKAGING("test %d %hd %hhd", i, s, sc);
TEST_PACKAGING("test %ld %llx %hhu %hu %u", li, lli, uc, us, ui);
TEST_PACKAGING("test %lu %llu", ul, ull);
TEST_PACKAGING("test %c %p", c, &c);
if (IS_ENABLED(CONFIG_CBPRINTF_FP_SUPPORT)) {
TEST_PACKAGING("test %f %a", f, d);
#if CONFIG_CBPRINTF_PACKAGE_LONGDOUBLE
long double ld = 1.2333;
TEST_PACKAGING("test %Lf", ld);
#endif
}
}
void test_main(void)
{
printk("sizeof: int=%zu long=%zu ptr=%zu long long=%zu double=%zu long double=%zu\n",
sizeof(int), sizeof(long), sizeof(void *), sizeof(long long),
sizeof(double), sizeof(long double));
printk("alignof: int=%zu long=%zu ptr=%zu long long=%zu double=%zu long double=%zu\n",
__alignof__(int), __alignof__(long), __alignof__(void *),
__alignof__(long long), __alignof__(double), __alignof__(long double));
printk("%s C11 _Generic\n", Z_C_GENERIC ? "With" : "Without");
ztest_test_suite(cbprintf_package,
ztest_unit_test(test_cbprintf_package)
);
ztest_run_test_suite(cbprintf_package);
}