]> Git Repo - J-u-boot.git/blame - test/compression.c
usb: Fix test failure with multiple partitions
[J-u-boot.git] / test / compression.c
CommitLineData
83d290c5 1// SPDX-License-Identifier: GPL-2.0+
3153e915
KC
2/*
3 * Copyright (c) 2013, The Chromium Authors
3153e915
KC
4 */
5
65d373ab 6#include <abuf.h>
6ed4dc78 7#include <bootm.h>
3153e915 8#include <command.h>
0c670fc1 9#include <gzip.h>
4d72caa5 10#include <image.h>
f7ae49fc 11#include <log.h>
3153e915 12#include <malloc.h>
0eb25b61 13#include <mapmem.h>
6ed4dc78 14#include <asm/io.h>
3153e915 15
2a2d8e94 16#include <u-boot/lz4.h>
3153e915
KC
17#include <u-boot/zlib.h>
18#include <bzlib.h>
19
20#include <lzma/LzmaTypes.h>
21#include <lzma/LzmaDec.h>
22#include <lzma/LzmaTools.h>
23
24#include <linux/lzo.h>
65d373ab 25#include <linux/zstd.h>
0aac10f2
SG
26#include <test/compression.h>
27#include <test/suites.h>
28#include <test/ut.h>
3153e915
KC
29
30static const char plain[] =
31 "I am a highly compressable bit of text.\n"
32 "I am a highly compressable bit of text.\n"
33 "I am a highly compressable bit of text.\n"
34 "There are many like me, but this one is mine.\n"
35 "If I were any shorter, there wouldn't be much sense in\n"
36 "compressing me in the first place. At least with lzo, anyway,\n"
37 "which appears to behave poorly in the face of short text\n"
38 "messages.\n";
39
40/* bzip2 -c /tmp/plain.txt > /tmp/plain.bz2 */
41static const char bzip2_compressed[] =
42 "\x42\x5a\x68\x39\x31\x41\x59\x26\x53\x59\xe5\x63\xdd\x09\x00\x00"
43 "\x28\x57\x80\x00\x10\x40\x85\x20\x20\x04\x00\x3f\xef\xdf\xf0\x30"
44 "\x00\xd6\xd0\x34\x91\x89\xa6\xf5\x4d\x19\x1a\x19\x0d\x02\x34\xd4"
45 "\xc9\x00\x34\x34\x00\x02\x48\x41\x35\x4f\xd4\xc6\x88\xd3\x50\x3d"
46 "\x4f\x51\x82\x4f\x88\xc3\x0d\x05\x62\x4f\x91\xa3\x52\x1b\xd0\x52"
47 "\x41\x4a\xa3\x98\xc2\x6b\xca\xa3\x82\xa5\xac\x8b\x15\x99\x68\xad"
48 "\xdf\x29\xd6\xf1\xf7\x5a\x10\xcd\x8c\x26\x61\x94\x95\xfe\x9e\x16"
49 "\x18\x28\x69\xd4\x23\x64\xcc\x2b\xe5\xe8\x5f\x00\xa4\x70\x26\x2c"
50 "\xee\xbd\x59\x6d\x6a\xec\xfc\x31\xda\x59\x0a\x14\x2a\x60\x1c\xf0"
51 "\x04\x86\x73\x9a\xc5\x5b\x87\x3f\x5b\x4c\x93\xe6\xb5\x35\x0d\xa6"
52 "\xb1\x2e\x62\x7b\xab\x67\xe7\x99\x2a\x14\x5e\x9f\x64\xcb\x96\xf4"
53 "\x0d\x65\xd4\x39\xe6\x8b\x7e\xea\x1c\x03\x69\x97\x83\x58\x91\x96"
54 "\xe1\xf0\x9d\xa4\x15\x8b\xb8\xc6\x93\xdc\x3d\xd9\x3c\x22\x55\xef"
55 "\xfb\xbb\x2a\xd3\x87\xa2\x8b\x04\xd9\x19\xf8\xe2\xfd\x4f\xdb\x1a"
56 "\x07\xc8\x60\xa3\x3f\xf8\xbb\x92\x29\xc2\x84\x87\x2b\x1e\xe8\x48";
093e8c8d 57static const unsigned long bzip2_compressed_size = sizeof(bzip2_compressed) - 1;
3153e915
KC
58
59/* lzma -z -c /tmp/plain.txt > /tmp/plain.lzma */
60static const char lzma_compressed[] =
61 "\x5d\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x24\x88"
62 "\x08\x26\xd8\x41\xff\x99\xc8\xcf\x66\x3d\x80\xac\xba\x17\xf1\xc8"
63 "\xb9\xdf\x49\x37\xb1\x68\xa0\x2a\xdd\x63\xd1\xa7\xa3\x66\xf8\x15"
64 "\xef\xa6\x67\x8a\x14\x18\x80\xcb\xc7\xb1\xcb\x84\x6a\xb2\x51\x16"
65 "\xa1\x45\xa0\xd6\x3e\x55\x44\x8a\x5c\xa0\x7c\xe5\xa8\xbd\x04\x57"
66 "\x8f\x24\xfd\xb9\x34\x50\x83\x2f\xf3\x46\x3e\xb9\xb0\x00\x1a\xf5"
67 "\xd3\x86\x7e\x8f\x77\xd1\x5d\x0e\x7c\xe1\xac\xde\xf8\x65\x1f\x4d"
68 "\xce\x7f\xa7\x3d\xaa\xcf\x26\xa7\x58\x69\x1e\x4c\xea\x68\x8a\xe5"
69 "\x89\xd1\xdc\x4d\xc7\xe0\x07\x42\xbf\x0c\x9d\x06\xd7\x51\xa2\x0b"
70 "\x7c\x83\x35\xe1\x85\xdf\xee\xfb\xa3\xee\x2f\x47\x5f\x8b\x70\x2b"
71 "\xe1\x37\xf3\x16\xf6\x27\x54\x8a\x33\x72\x49\xea\x53\x7d\x60\x0b"
72 "\x21\x90\x66\xe7\x9e\x56\x61\x5d\xd8\xdc\x59\xf0\xac\x2f\xd6\x49"
73 "\x6b\x85\x40\x08\x1f\xdf\x26\x25\x3b\x72\x44\xb0\xb8\x21\x2f\xb3"
74 "\xd7\x9b\x24\x30\x78\x26\x44\x07\xc3\x33\xd1\x4d\x03\x1b\xe1\xff"
75 "\xfd\xf5\x50\x8d\xca";
093e8c8d 76static const unsigned long lzma_compressed_size = sizeof(lzma_compressed) - 1;
3153e915
KC
77
78/* lzop -c /tmp/plain.txt > /tmp/plain.lzo */
79static const char lzo_compressed[] =
80 "\x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a\x10\x30\x20\x60\x09\x40\x01"
81 "\x05\x03\x00\x00\x09\x00\x00\x81\xb4\x52\x09\x54\xf1\x00\x00\x00"
82 "\x00\x09\x70\x6c\x61\x69\x6e\x2e\x74\x78\x74\x65\xb1\x07\x9c\x00"
83 "\x00\x01\x5e\x00\x00\x01\x0f\xc3\xc7\x7a\xe0\x00\x16\x49\x20\x61"
84 "\x6d\x20\x61\x20\x68\x69\x67\x68\x6c\x79\x20\x63\x6f\x6d\x70\x72"
85 "\x65\x73\x73\x61\x62\x6c\x65\x20\x62\x69\x74\x20\x6f\x66\x20\x74"
86 "\x65\x78\x74\x2e\x0a\x20\x2f\x9c\x00\x00\x22\x54\x68\x65\x72\x65"
87 "\x20\x61\x72\x65\x20\x6d\x61\x6e\x79\x20\x6c\x69\x6b\x65\x20\x6d"
88 "\x65\x2c\x20\x62\x75\x74\x20\x74\x68\x69\x73\x20\x6f\x6e\x65\x20"
89 "\x69\x73\x20\x6d\x69\x6e\x65\x2e\x0a\x49\x66\x20\x49\x20\x77\x84"
90 "\x06\x0a\x6e\x79\x20\x73\x68\x6f\x72\x74\x65\x72\x2c\x20\x74\x90"
91 "\x08\x00\x08\x77\x6f\x75\x6c\x64\x6e\x27\x74\x20\x62\x65\x20\x6d"
92 "\x75\x63\x68\x20\x73\x65\x6e\x73\x65\x20\x69\x6e\x0a\xf8\x19\x02"
93 "\x69\x6e\x67\x20\x6d\x64\x02\x64\x06\x00\x5a\x20\x66\x69\x72\x73"
94 "\x74\x20\x70\x6c\x61\x63\x65\x2e\x20\x41\x74\x20\x6c\x65\x61\x73"
95 "\x74\x20\x77\x69\x74\x68\x20\x6c\x7a\x6f\x2c\x20\x61\x6e\x79\x77"
96 "\x61\x79\x2c\x0a\x77\x68\x69\x63\x68\x20\x61\x70\x70\x65\x61\x72"
97 "\x73\x20\x74\x6f\x20\x62\x65\x68\x61\x76\x65\x20\x70\x6f\x6f\x72"
98 "\x6c\x79\x20\x69\x6e\x20\x74\x68\x65\x20\x66\x61\x63\x65\x20\x6f"
99 "\x66\x20\x73\x68\x6f\x72\x74\x20\x74\x65\x78\x74\x0a\x6d\x65\x73"
100 "\x73\x61\x67\x65\x73\x2e\x0a\x11\x00\x00\x00\x00\x00\x00";
093e8c8d 101static const unsigned long lzo_compressed_size = sizeof(lzo_compressed) - 1;
3153e915 102
027b728d
JW
103/* lz4 -z /tmp/plain.txt > /tmp/plain.lz4 */
104static const char lz4_compressed[] =
105 "\x04\x22\x4d\x18\x64\x70\xb9\x01\x01\x00\x00\xff\x19\x49\x20\x61"
106 "\x6d\x20\x61\x20\x68\x69\x67\x68\x6c\x79\x20\x63\x6f\x6d\x70\x72"
107 "\x65\x73\x73\x61\x62\x6c\x65\x20\x62\x69\x74\x20\x6f\x66\x20\x74"
108 "\x65\x78\x74\x2e\x0a\x28\x00\x3d\xf1\x25\x54\x68\x65\x72\x65\x20"
109 "\x61\x72\x65\x20\x6d\x61\x6e\x79\x20\x6c\x69\x6b\x65\x20\x6d\x65"
110 "\x2c\x20\x62\x75\x74\x20\x74\x68\x69\x73\x20\x6f\x6e\x65\x20\x69"
111 "\x73\x20\x6d\x69\x6e\x65\x2e\x0a\x49\x66\x20\x49\x20\x77\x32\x00"
112 "\xd1\x6e\x79\x20\x73\x68\x6f\x72\x74\x65\x72\x2c\x20\x74\x45\x00"
113 "\xf4\x0b\x77\x6f\x75\x6c\x64\x6e\x27\x74\x20\x62\x65\x20\x6d\x75"
114 "\x63\x68\x20\x73\x65\x6e\x73\x65\x20\x69\x6e\x0a\xcf\x00\x50\x69"
115 "\x6e\x67\x20\x6d\x12\x00\x00\x32\x00\xf0\x11\x20\x66\x69\x72\x73"
116 "\x74\x20\x70\x6c\x61\x63\x65\x2e\x20\x41\x74\x20\x6c\x65\x61\x73"
117 "\x74\x20\x77\x69\x74\x68\x20\x6c\x7a\x6f\x2c\x63\x00\xf5\x14\x77"
118 "\x61\x79\x2c\x0a\x77\x68\x69\x63\x68\x20\x61\x70\x70\x65\x61\x72"
119 "\x73\x20\x74\x6f\x20\x62\x65\x68\x61\x76\x65\x20\x70\x6f\x6f\x72"
120 "\x6c\x79\x4e\x00\x30\x61\x63\x65\x27\x01\x01\x95\x00\x01\x2d\x01"
121 "\xb0\x0a\x6d\x65\x73\x73\x61\x67\x65\x73\x2e\x0a\x00\x00\x00\x00"
122 "\x9d\x12\x8c\x9d";
093e8c8d 123static const unsigned long lz4_compressed_size = sizeof(lz4_compressed) - 1;
027b728d 124
65d373ab
BM
125/* zstd -19 -c /tmp/plain.txt > /tmp/plain.zst */
126static const char zstd_compressed[] =
127 "\x28\xb5\x2f\xfd\x64\x5e\x00\xbd\x05\x00\x02\x0e\x26\x1a\x70\x17"
128 "\xb8\x0d\x0c\x53\x5c\x9d\x97\xee\xa0\x5d\x84\x89\x3f\x5c\x7a\x78"
129 "\x00\x80\x80\x0f\xe8\xdf\xaf\x06\x66\xd0\x23\xa6\x7a\x64\x8e\xf4"
130 "\x0d\x5b\x47\x65\x26\x7e\x81\xdd\x0b\xe7\x5a\x95\x3d\x49\xcc\x67"
131 "\xe0\x2d\x46\x58\xb6\xac\x64\x16\xf2\xe0\xf8\x16\x17\xaf\xda\x8f"
132 "\x37\xc0\xc3\x0d\x3b\x89\x57\x15\x1e\x46\x46\x12\x9a\x84\xbe\xa6"
133 "\xab\xcf\x50\x90\x5f\x78\x01\xd2\xc0\x51\x72\x59\x0b\xea\xab\xf2"
134 "\xd4\x2b\x2d\x26\x7c\x10\x66\x78\x42\x64\x45\x3f\xa5\x15\x6f\xbd"
135 "\x4a\x61\xe1\xc8\x27\xc0\xe3\x95\x0c\xf9\xca\x7c\xf5\x13\x30\xc3"
136 "\x1a\x7c\x7d\xa4\x17\x0b\xff\x14\xa6\x7a\x95\xa0\x34\xbc\xce\x21"
137 "\x78\x36\x23\x33\x11\x09\x00\x60\x13\x00\x63\xa3\x8e\x28\x94\x55"
138 "\x15\xb6\x26\x68\x05\x4f\x23\x12\xee\x53\x55\x2d\x44\x2f\x54\x95"
139 "\x01\xe4\xf4\x6e\xfa";
140static const unsigned long zstd_compressed_size = sizeof(zstd_compressed) - 1;
141
3153e915
KC
142#define TEST_BUFFER_SIZE 512
143
0aac10f2
SG
144typedef int (*mutate_func)(struct unit_test_state *uts, void *, unsigned long,
145 void *, unsigned long, unsigned long *);
3153e915 146
0aac10f2
SG
147static int compress_using_gzip(struct unit_test_state *uts,
148 void *in, unsigned long in_size,
3153e915
KC
149 void *out, unsigned long out_max,
150 unsigned long *out_size)
151{
152 int ret;
153 unsigned long inout_size = out_max;
154
155 ret = gzip(out, &inout_size, in, in_size);
156 if (out_size)
157 *out_size = inout_size;
158
159 return ret;
160}
161
0aac10f2
SG
162static int uncompress_using_gzip(struct unit_test_state *uts,
163 void *in, unsigned long in_size,
3153e915
KC
164 void *out, unsigned long out_max,
165 unsigned long *out_size)
166{
167 int ret;
168 unsigned long inout_size = in_size;
169
170 ret = gunzip(out, out_max, in, &inout_size);
171 if (out_size)
172 *out_size = inout_size;
173
174 return ret;
175}
176
0aac10f2
SG
177static int compress_using_bzip2(struct unit_test_state *uts,
178 void *in, unsigned long in_size,
93e14596
WD
179 void *out, unsigned long out_max,
180 unsigned long *out_size)
3153e915
KC
181{
182 /* There is no bzip2 compression in u-boot, so fake it. */
0aac10f2 183 ut_asserteq(in_size, strlen(plain));
f91f366b 184 ut_asserteq_mem(plain, in, in_size);
3153e915
KC
185
186 if (bzip2_compressed_size > out_max)
187 return -1;
188
189 memcpy(out, bzip2_compressed, bzip2_compressed_size);
190 if (out_size)
191 *out_size = bzip2_compressed_size;
192
193 return 0;
194}
195
0aac10f2
SG
196static int uncompress_using_bzip2(struct unit_test_state *uts,
197 void *in, unsigned long in_size,
3153e915
KC
198 void *out, unsigned long out_max,
199 unsigned long *out_size)
200{
201 int ret;
202 unsigned int inout_size = out_max;
203
204 ret = BZ2_bzBuffToBuffDecompress(out, &inout_size, in, in_size,
205 CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0);
206 if (out_size)
207 *out_size = inout_size;
208
209 return (ret != BZ_OK);
210}
211
0aac10f2
SG
212static int compress_using_lzma(struct unit_test_state *uts,
213 void *in, unsigned long in_size,
3153e915
KC
214 void *out, unsigned long out_max,
215 unsigned long *out_size)
216{
217 /* There is no lzma compression in u-boot, so fake it. */
0aac10f2 218 ut_asserteq(in_size, strlen(plain));
f91f366b 219 ut_asserteq_mem(plain, in, in_size);
3153e915
KC
220
221 if (lzma_compressed_size > out_max)
222 return -1;
223
224 memcpy(out, lzma_compressed, lzma_compressed_size);
225 if (out_size)
226 *out_size = lzma_compressed_size;
227
228 return 0;
229}
230
0aac10f2
SG
231static int uncompress_using_lzma(struct unit_test_state *uts,
232 void *in, unsigned long in_size,
3153e915
KC
233 void *out, unsigned long out_max,
234 unsigned long *out_size)
235{
236 int ret;
237 SizeT inout_size = out_max;
238
239 ret = lzmaBuffToBuffDecompress(out, &inout_size, in, in_size);
240 if (out_size)
241 *out_size = inout_size;
242
243 return (ret != SZ_OK);
244}
245
0aac10f2
SG
246static int compress_using_lzo(struct unit_test_state *uts,
247 void *in, unsigned long in_size,
3153e915
KC
248 void *out, unsigned long out_max,
249 unsigned long *out_size)
250{
251 /* There is no lzo compression in u-boot, so fake it. */
0aac10f2 252 ut_asserteq(in_size, strlen(plain));
f91f366b 253 ut_asserteq_mem(plain, in, in_size);
3153e915
KC
254
255 if (lzo_compressed_size > out_max)
256 return -1;
257
258 memcpy(out, lzo_compressed, lzo_compressed_size);
259 if (out_size)
260 *out_size = lzo_compressed_size;
261
262 return 0;
263}
264
0aac10f2
SG
265static int uncompress_using_lzo(struct unit_test_state *uts,
266 void *in, unsigned long in_size,
3153e915
KC
267 void *out, unsigned long out_max,
268 unsigned long *out_size)
269{
270 int ret;
271 size_t input_size = in_size;
272 size_t output_size = out_max;
273
274 ret = lzop_decompress(in, input_size, out, &output_size);
275 if (out_size)
276 *out_size = output_size;
277
278 return (ret != LZO_E_OK);
279}
280
0aac10f2
SG
281static int compress_using_lz4(struct unit_test_state *uts,
282 void *in, unsigned long in_size,
027b728d
JW
283 void *out, unsigned long out_max,
284 unsigned long *out_size)
285{
286 /* There is no lz4 compression in u-boot, so fake it. */
0aac10f2 287 ut_asserteq(in_size, strlen(plain));
f91f366b 288 ut_asserteq_mem(plain, in, in_size);
027b728d
JW
289
290 if (lz4_compressed_size > out_max)
291 return -1;
292
293 memcpy(out, lz4_compressed, lz4_compressed_size);
294 if (out_size)
295 *out_size = lz4_compressed_size;
296
297 return 0;
298}
299
0aac10f2
SG
300static int uncompress_using_lz4(struct unit_test_state *uts,
301 void *in, unsigned long in_size,
027b728d
JW
302 void *out, unsigned long out_max,
303 unsigned long *out_size)
304{
305 int ret;
306 size_t input_size = in_size;
307 size_t output_size = out_max;
308
309 ret = ulz4fn(in, input_size, out, &output_size);
310 if (out_size)
311 *out_size = output_size;
312
313 return (ret != 0);
314}
315
65d373ab
BM
316static int compress_using_zstd(struct unit_test_state *uts,
317 void *in, unsigned long in_size,
318 void *out, unsigned long out_max,
319 unsigned long *out_size)
320{
321 /* There is no zstd compression in u-boot, so fake it. */
322 ut_asserteq(in_size, strlen(plain));
323 ut_asserteq_mem(plain, in, in_size);
324
325 if (zstd_compressed_size > out_max)
326 return -1;
327
328 memcpy(out, zstd_compressed, zstd_compressed_size);
329 if (out_size)
330 *out_size = zstd_compressed_size;
331
332 return 0;
333}
334
335static int uncompress_using_zstd(struct unit_test_state *uts,
336 void *in, unsigned long in_size,
337 void *out, unsigned long out_max,
338 unsigned long *out_size)
339{
340 struct abuf in_buf, out_buf;
341 int ret;
342
343 abuf_init_set(&in_buf, in, in_size);
344 abuf_init_set(&out_buf, out, out_max);
345
346 ret = zstd_decompress(&in_buf, &out_buf);
347 if (ret >= 0) {
348 *out_size = ret;
349 ret = 0;
350 }
351
352 return ret;
353}
354
3153e915
KC
355#define errcheck(statement) if (!(statement)) { \
356 fprintf(stderr, "\tFailed: %s\n", #statement); \
357 ret = 1; \
358 goto out; \
359}
360
49f22c38
SG
361struct buf_state {
362 ulong orig_size;
363 ulong compressed_size;
364 ulong uncompressed_size;
3153e915 365 void *orig_buf;
49f22c38
SG
366 void *compressed_buf;
367 void *uncompressed_buf;
368 void *compare_buf;
369};
370
0aac10f2 371static int run_test_internal(struct unit_test_state *uts, char *name,
49f22c38
SG
372 mutate_func compress, mutate_func uncompress,
373 struct buf_state *buf)
374{
3153e915
KC
375 int ret;
376
3153e915 377 /* Compress works as expected. */
49f22c38
SG
378 printf("\torig_size:%lu\n", buf->orig_size);
379 memset(buf->compressed_buf, 'A', TEST_BUFFER_SIZE);
bde4c49c 380 ut_assertok(compress(uts, buf->orig_buf, buf->orig_size,
0aac10f2 381 buf->compressed_buf, buf->compressed_size,
bde4c49c 382 &buf->compressed_size));
49f22c38 383 printf("\tcompressed_size:%lu\n", buf->compressed_size);
bde4c49c
BM
384 ut_assert(buf->compressed_size > 0);
385 ut_assert(buf->compressed_size < buf->orig_size);
386 ut_assert(((char *)buf->compressed_buf)[buf->compressed_size - 1]
387 != 'A');
388 ut_asserteq(((char *)buf->compressed_buf)[buf->compressed_size], 'A');
3153e915
KC
389
390 /* Uncompresses with space remaining. */
bde4c49c 391 ut_assertok(uncompress(uts, buf->compressed_buf, buf->compressed_size,
49f22c38 392 buf->uncompressed_buf, buf->uncompressed_size,
bde4c49c 393 &buf->uncompressed_size));
49f22c38 394 printf("\tuncompressed_size:%lu\n", buf->uncompressed_size);
bde4c49c
BM
395 ut_asserteq(buf->uncompressed_size, buf->orig_size);
396 ut_asserteq_mem(buf->orig_buf, buf->uncompressed_buf, buf->orig_size);
3153e915
KC
397
398 /* Uncompresses with exactly the right size output buffer. */
49f22c38 399 memset(buf->uncompressed_buf, 'A', TEST_BUFFER_SIZE);
bde4c49c 400 ut_assertok(uncompress(uts, buf->compressed_buf, buf->compressed_size,
49f22c38 401 buf->uncompressed_buf, buf->orig_size,
bde4c49c
BM
402 &buf->uncompressed_size));
403 ut_asserteq(buf->uncompressed_size, buf->orig_size);
404 ut_asserteq_mem(buf->orig_buf, buf->uncompressed_buf, buf->orig_size);
405 ut_asserteq(((char *)buf->uncompressed_buf)[buf->orig_size], 'A');
3153e915 406
43b05988
BM
407 /* Uncompresses with trailing garbage in input buffer. */
408 memset(buf->uncompressed_buf, 'A', TEST_BUFFER_SIZE);
bde4c49c 409 ut_assertok(uncompress(uts, buf->compressed_buf, buf->compressed_size + 4,
43b05988 410 buf->uncompressed_buf, buf->uncompressed_size,
bde4c49c
BM
411 &buf->uncompressed_size));
412 ut_asserteq(buf->uncompressed_size, buf->orig_size);
413 ut_asserteq_mem(buf->orig_buf, buf->uncompressed_buf, buf->orig_size);
43b05988 414
3153e915 415 /* Make sure compression does not over-run. */
49f22c38 416 memset(buf->compare_buf, 'A', TEST_BUFFER_SIZE);
0aac10f2 417 ret = compress(uts, buf->orig_buf, buf->orig_size,
49f22c38 418 buf->compare_buf, buf->compressed_size - 1,
3153e915 419 NULL);
bde4c49c
BM
420 ut_asserteq(((char *)buf->compare_buf)[buf->compressed_size], 'A');
421 ut_assert(ret != 0);
3153e915
KC
422 printf("\tcompress does not overrun\n");
423
424 /* Make sure decompression does not over-run. */
49f22c38 425 memset(buf->compare_buf, 'A', TEST_BUFFER_SIZE);
0aac10f2 426 ret = uncompress(uts, buf->compressed_buf, buf->compressed_size,
49f22c38 427 buf->compare_buf, buf->uncompressed_size - 1,
3153e915 428 NULL);
bde4c49c
BM
429 ut_asserteq(((char *)buf->compare_buf)[buf->uncompressed_size - 1], 'A');
430 ut_assert(ret != 0);
3153e915
KC
431 printf("\tuncompress does not overrun\n");
432
433 /* Got here, everything is fine. */
bde4c49c 434 return 0;
49f22c38
SG
435}
436
0aac10f2
SG
437static int run_test(struct unit_test_state *uts, char *name,
438 mutate_func compress, mutate_func uncompress)
49f22c38
SG
439{
440 struct buf_state sbuf, *buf = &sbuf;
441 int ret;
442
443 printf(" testing %s ...\n", name);
444
445 buf->orig_buf = (void *)plain;
446 buf->orig_size = strlen(buf->orig_buf); /* Trailing NUL not included */
447 errcheck(buf->orig_size > 0);
448
449 buf->compressed_size = TEST_BUFFER_SIZE;
450 buf->uncompressed_size = TEST_BUFFER_SIZE;
451 buf->compressed_buf = malloc(buf->compressed_size);
452 errcheck(buf->compressed_buf);
453 buf->uncompressed_buf = malloc(buf->uncompressed_size);
454 errcheck(buf->uncompressed_buf);
455 buf->compare_buf = malloc(buf->uncompressed_size);
456 errcheck(buf->compare_buf);
457
0aac10f2 458 ret = run_test_internal(uts, name, compress, uncompress, buf);
3153e915
KC
459out:
460 printf(" %s: %s\n", name, ret == 0 ? "ok" : "FAILED");
461
49f22c38
SG
462 free(buf->compare_buf);
463 free(buf->uncompressed_buf);
464 free(buf->compressed_buf);
3153e915
KC
465
466 return ret;
467}
468
0aac10f2 469static int compression_test_gzip(struct unit_test_state *uts)
3153e915 470{
0aac10f2
SG
471 return run_test(uts, "gzip", compress_using_gzip,
472 uncompress_using_gzip);
473}
474COMPRESSION_TEST(compression_test_gzip, 0);
3153e915 475
0aac10f2
SG
476static int compression_test_bzip2(struct unit_test_state *uts)
477{
478 return run_test(uts, "bzip2", compress_using_bzip2,
479 uncompress_using_bzip2);
480}
481COMPRESSION_TEST(compression_test_bzip2, 0);
482
483static int compression_test_lzma(struct unit_test_state *uts)
484{
485 return run_test(uts, "lzma", compress_using_lzma,
486 uncompress_using_lzma);
487}
488COMPRESSION_TEST(compression_test_lzma, 0);
3153e915 489
0aac10f2
SG
490static int compression_test_lzo(struct unit_test_state *uts)
491{
492 return run_test(uts, "lzo", compress_using_lzo, uncompress_using_lzo);
493}
494COMPRESSION_TEST(compression_test_lzo, 0);
3153e915 495
0aac10f2
SG
496static int compression_test_lz4(struct unit_test_state *uts)
497{
498 return run_test(uts, "lz4", compress_using_lz4, uncompress_using_lz4);
3153e915 499}
0aac10f2 500COMPRESSION_TEST(compression_test_lz4, 0);
3153e915 501
65d373ab
BM
502static int compression_test_zstd(struct unit_test_state *uts)
503{
504 return run_test(uts, "zstd", compress_using_zstd,
505 uncompress_using_zstd);
506}
507COMPRESSION_TEST(compression_test_zstd, 0);
508
0aac10f2
SG
509static int compress_using_none(struct unit_test_state *uts,
510 void *in, unsigned long in_size,
6ed4dc78
SG
511 void *out, unsigned long out_max,
512 unsigned long *out_size)
513{
514 /* Here we just copy */
515 memcpy(out, in, in_size);
516 *out_size = in_size;
517
518 return 0;
519}
520
521/**
6cc8e545 522 * run_bootm_test() - Run tests on the bootm decompression function
6ed4dc78
SG
523 *
524 * @comp_type: Compression type to test
525 * @compress: Our function to compress data
185f812c 526 * Return: 0 if OK, non-zero on failure
6ed4dc78 527 */
0aac10f2
SG
528static int run_bootm_test(struct unit_test_state *uts, int comp_type,
529 mutate_func compress)
6ed4dc78
SG
530{
531 ulong compress_size = 1024;
532 void *compress_buff;
533 int unc_len;
534 int err = 0;
535 const ulong image_start = 0;
536 const ulong load_addr = 0x1000;
537 ulong load_end;
538
539 printf("Testing: %s\n", genimg_get_comp_name(comp_type));
540 compress_buff = map_sysmem(image_start, 0);
541 unc_len = strlen(plain);
0aac10f2 542 compress(uts, (void *)plain, unc_len, compress_buff, compress_size,
6ed4dc78 543 &compress_size);
2090854c
JW
544 err = image_decomp(comp_type, load_addr, image_start,
545 IH_TYPE_KERNEL, map_sysmem(load_addr, 0),
546 compress_buff, compress_size, unc_len,
547 &load_end);
0aac10f2 548 ut_assertok(err);
2090854c
JW
549 err = image_decomp(comp_type, load_addr, image_start,
550 IH_TYPE_KERNEL, map_sysmem(load_addr, 0),
551 compress_buff, compress_size, unc_len - 1,
552 &load_end);
0aac10f2 553 ut_assert(err);
6ed4dc78
SG
554
555 /* We can't detect corruption when not decompressing */
556 if (comp_type == IH_COMP_NONE)
557 return 0;
558 memset(compress_buff + compress_size / 2, '\x49',
559 compress_size / 2);
2090854c
JW
560 err = image_decomp(comp_type, load_addr, image_start,
561 IH_TYPE_KERNEL, map_sysmem(load_addr, 0),
562 compress_buff, compress_size, 0x10000,
563 &load_end);
0aac10f2 564 ut_assert(err);
6ed4dc78
SG
565
566 return 0;
567}
568
0aac10f2 569static int compression_test_bootm_gzip(struct unit_test_state *uts)
6ed4dc78 570{
0aac10f2
SG
571 return run_bootm_test(uts, IH_COMP_GZIP, compress_using_gzip);
572}
573COMPRESSION_TEST(compression_test_bootm_gzip, 0);
6ed4dc78 574
0aac10f2
SG
575static int compression_test_bootm_bzip2(struct unit_test_state *uts)
576{
577 return run_bootm_test(uts, IH_COMP_BZIP2, compress_using_bzip2);
578}
579COMPRESSION_TEST(compression_test_bootm_bzip2, 0);
6ed4dc78 580
0aac10f2
SG
581static int compression_test_bootm_lzma(struct unit_test_state *uts)
582{
583 return run_bootm_test(uts, IH_COMP_LZMA, compress_using_lzma);
584}
585COMPRESSION_TEST(compression_test_bootm_lzma, 0);
6ed4dc78 586
0aac10f2
SG
587static int compression_test_bootm_lzo(struct unit_test_state *uts)
588{
589 return run_bootm_test(uts, IH_COMP_LZO, compress_using_lzo);
6ed4dc78 590}
0aac10f2 591COMPRESSION_TEST(compression_test_bootm_lzo, 0);
6ed4dc78 592
0aac10f2
SG
593static int compression_test_bootm_lz4(struct unit_test_state *uts)
594{
595 return run_bootm_test(uts, IH_COMP_LZ4, compress_using_lz4);
596}
597COMPRESSION_TEST(compression_test_bootm_lz4, 0);
6ed4dc78 598
65d373ab
BM
599static int compression_test_bootm_zstd(struct unit_test_state *uts)
600{
601 return run_bootm_test(uts, IH_COMP_ZSTD, compress_using_zstd);
602}
603COMPRESSION_TEST(compression_test_bootm_zstd, 0);
604
0aac10f2
SG
605static int compression_test_bootm_none(struct unit_test_state *uts)
606{
607 return run_bootm_test(uts, IH_COMP_NONE, compress_using_none);
608}
609COMPRESSION_TEST(compression_test_bootm_none, 0);
610
09140113
SG
611int do_ut_compression(struct cmd_tbl *cmdtp, int flag, int argc,
612 char *const argv[])
0aac10f2 613{
a7a98755
SG
614 struct unit_test *tests = UNIT_TEST_SUITE_START(compression_test);
615 const int n_ents = UNIT_TEST_SUITE_COUNT(compression_test);
0aac10f2 616
4ad4edfe
PR
617 return cmd_ut_category("compression", "compression_test_",
618 tests, n_ents, argc, argv);
0aac10f2 619}
This page took 0.481794 seconds and 4 git commands to generate.