1 /* SPDX-License-Identifier: Apache-2.0
2 * Copyright(c) 2021 Cisco Systems, Inc.
5 #include <vppinfra/format.h>
6 #include <vppinfra/test/test.h>
7 #include <vppinfra/vector/compress.h>
10 clib_compress_u64_wrapper (u64 *dst, u64 *src, u64 *mask, u32 n_elts)
12 return clib_compress_u64 (dst, src, mask, n_elts);
16 clib_compress_u32_wrapper (u32 *dst, u32 *src, u64 *mask, u32 n_elts)
18 return clib_compress_u32 (dst, src, mask, n_elts);
22 clib_compress_u16_wrapper (u16 *dst, u16 *src, u64 *mask, u32 n_elts)
24 return clib_compress_u16 (dst, src, mask, n_elts);
28 clib_compress_u8_wrapper (u8 *dst, u8 *src, u64 *mask, u32 n_elts)
30 return clib_compress_u8 (dst, src, mask, n_elts);
39 static compress_test_t tests[] = {
40 { .mask = { 1 }, .n_elts = 1 },
41 { .mask = { 2 }, .n_elts = 2 },
42 { .mask = { 3 }, .n_elts = 2 },
43 { .mask = { 0, 1 }, .n_elts = 66 },
44 { .mask = { 0, 2 }, .n_elts = 69 },
45 { .mask = { 0, 3 }, .n_elts = 66 },
46 { .mask = { ~0ULL, ~0ULL, ~0ULL, ~0ULL }, .n_elts = 62 },
47 { .mask = { ~0ULL, ~0ULL, ~0ULL, ~0ULL }, .n_elts = 255 },
48 { .mask = { ~0ULL, 1, 1, ~0ULL }, .n_elts = 256 },
52 test_clib_compress_u64 (clib_error_t *err)
56 for (i = 0; i < ARRAY_LEN (tests); i++)
58 compress_test_t *t = tests + i;
60 #ifdef CLIB_SANITIZE_ADDR
62 #else /* CLIB_SANITIZE_ADDR */
64 #endif /* CLIB_SANITIZE_ADDR */
67 for (j = 0; j < t->n_elts; j++)
70 for (j = 0; j < ARRAY_LEN (dst); j++)
71 dst[j] = 0xa5a5a5a5a5a5a5a5;
73 r = clib_compress_u64_wrapper (dst, src, t->mask, t->n_elts);
75 for (j = 0; j < t->n_elts; j++)
77 if ((t->mask[j >> 6] & (1ULL << (j & 0x3f))) == 0)
80 return clib_error_return (err,
81 "wrong data in testcase %u at "
82 "(dst[%u] = 0x%lx, src[%u] = 0x%lx)",
83 i, dp - dst, dp[0], j, src[j]);
87 #ifndef CLIB_SANITIZE_ADDR
88 if (dst[dp - dst + 1] != 0xa5a5a5a5a5a5a5a5)
89 return clib_error_return (err, "buffer overrun in testcase %u", i);
90 #endif /* CLIB_SANITIZE_ADDR */
93 return clib_error_return (err, "wrong number of elts in testcase %u",
100 static clib_error_t *
101 test_clib_compress_u32 (clib_error_t *err)
105 for (i = 0; i < ARRAY_LEN (tests); i++)
107 compress_test_t *t = tests + i;
109 #ifdef CLIB_SANITIZE_ADDR
111 #else /* CLIB_SANITIZE_ADDR */
113 #endif /* CLIB_SANITIZE_ADDR */
116 for (j = 0; j < t->n_elts; j++)
119 for (j = 0; j < ARRAY_LEN (dst); j++)
122 r = clib_compress_u32_wrapper (dst, src, t->mask, t->n_elts);
124 for (j = 0; j < t->n_elts; j++)
126 if ((t->mask[j >> 6] & (1ULL << (j & 0x3f))) == 0)
130 return clib_error_return (err,
131 "wrong data in testcase %u at "
132 "(dst[%u] = 0x%x, src[%u] = 0x%x)",
133 i, dp - dst, dp[0], j, src[j]);
137 #ifndef CLIB_SANITIZE_ADDR
138 if (dst[dp - dst + 1] != 0xa5a5a5a5)
139 return clib_error_return (err, "buffer overrun in testcase %u", i);
140 #endif /* CLIB_SANITIZE_ADDR */
143 return clib_error_return (err, "wrong number of elts in testcase %u",
150 static clib_error_t *
151 test_clib_compress_u16 (clib_error_t *err)
155 for (i = 0; i < ARRAY_LEN (tests); i++)
157 compress_test_t *t = tests + i;
159 #ifdef CLIB_SANITIZE_ADDR
161 #else /* CLIB_SANITIZE_ADDR */
163 #endif /* CLIB_SANITIZE_ADDR */
166 for (j = 0; j < t->n_elts; j++)
169 for (j = 0; j < ARRAY_LEN (dst); j++)
172 r = clib_compress_u16_wrapper (dst, src, t->mask, t->n_elts);
174 for (j = 0; j < t->n_elts; j++)
176 if ((t->mask[j >> 6] & (1ULL << (j & 0x3f))) == 0)
179 return clib_error_return (err,
180 "wrong data in testcase %u at "
181 "(dst[%u] = 0x%x, src[%u] = 0x%x)",
182 i, dp - dst, dp[0], j, src[j]);
186 #ifndef CLIB_SANITIZE_ADDR
187 if (dst[dp - dst + 1] != 0xa5a5)
188 return clib_error_return (err, "buffer overrun in testcase %u", i);
189 #endif /* CLIB_SANITIZE_ADDR */
192 return clib_error_return (err, "wrong number of elts in testcase %u",
199 static clib_error_t *
200 test_clib_compress_u8 (clib_error_t *err)
204 for (i = 0; i < ARRAY_LEN (tests); i++)
206 compress_test_t *t = tests + i;
208 #ifdef CLIB_SANITIZE_ADDR
210 #else /* CLIB_SANITIZE_ADDR */
212 #endif /* CLIB_SANITIZE_ADDR */
215 for (j = 0; j < t->n_elts; j++)
218 for (j = 0; j < ARRAY_LEN (dst); j++)
221 r = clib_compress_u8_wrapper (dst, src, t->mask, t->n_elts);
223 for (j = 0; j < t->n_elts; j++)
225 if ((t->mask[j >> 6] & (1ULL << (j & 0x3f))) == 0)
228 return clib_error_return (err,
229 "wrong data in testcase %u at "
230 "(dst[%u] = 0x%x, src[%u] = 0x%x)",
231 i, dp - dst, dp[0], j, src[j]);
235 #ifndef CLIB_SANITIZE_ADDR
236 if (dst[dp - dst + 1] != 0xa5)
237 return clib_error_return (err, "buffer overrun in testcase %u", i);
238 #endif /* CLIB_SANITIZE_ADDR */
241 return clib_error_return (err, "wrong number of elts in testcase %u",
248 REGISTER_TEST (clib_compress_u64) = {
249 .name = "clib_compress_u64",
250 .fn = test_clib_compress_u64,
253 REGISTER_TEST (clib_compress_u32) = {
254 .name = "clib_compress_u32",
255 .fn = test_clib_compress_u32,
258 REGISTER_TEST (clib_compress_u16) = {
259 .name = "clib_compress_u16",
260 .fn = test_clib_compress_u16,
263 REGISTER_TEST (clib_compress_u8) = {
264 .name = "clib_compress_u8",
265 .fn = test_clib_compress_u8,