1da1aee87SGreg Tucker /**********************************************************************
2da1aee87SGreg Tucker Copyright(c) 2011-2018 Intel Corporation All rights reserved.
3da1aee87SGreg Tucker
4da1aee87SGreg Tucker Redistribution and use in source and binary forms, with or without
5da1aee87SGreg Tucker modification, are permitted provided that the following conditions
6da1aee87SGreg Tucker are met:
7da1aee87SGreg Tucker * Redistributions of source code must retain the above copyright
8da1aee87SGreg Tucker notice, this list of conditions and the following disclaimer.
9da1aee87SGreg Tucker * Redistributions in binary form must reproduce the above copyright
10da1aee87SGreg Tucker notice, this list of conditions and the following disclaimer in
11da1aee87SGreg Tucker the documentation and/or other materials provided with the
12da1aee87SGreg Tucker distribution.
13da1aee87SGreg Tucker * Neither the name of Intel Corporation nor the names of its
14da1aee87SGreg Tucker contributors may be used to endorse or promote products derived
15da1aee87SGreg Tucker from this software without specific prior written permission.
16da1aee87SGreg Tucker
17da1aee87SGreg Tucker THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18da1aee87SGreg Tucker "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19da1aee87SGreg Tucker LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20da1aee87SGreg Tucker A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21da1aee87SGreg Tucker OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22da1aee87SGreg Tucker SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23da1aee87SGreg Tucker LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24da1aee87SGreg Tucker DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25da1aee87SGreg Tucker THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26da1aee87SGreg Tucker (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27da1aee87SGreg Tucker OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28da1aee87SGreg Tucker **********************************************************************/
29a8966b67SGreg Tucker
30a8966b67SGreg Tucker #include <stdio.h>
31a8966b67SGreg Tucker #include <stdlib.h>
32a8966b67SGreg Tucker #include <string.h>
33a8966b67SGreg Tucker #include <stdint.h>
34a8966b67SGreg Tucker #include "igzip_checksums.h"
35a8966b67SGreg Tucker #include "checksum_test_ref.h"
36112dd72cSGreg Tucker #include "test.h"
37a8966b67SGreg Tucker
38a8966b67SGreg Tucker #ifndef TEST_SEED
39a8966b67SGreg Tucker #define TEST_SEED 0x1234
40a8966b67SGreg Tucker #endif
41a8966b67SGreg Tucker
42a8966b67SGreg Tucker #define MAX_BUF 512
43a8966b67SGreg Tucker #define TEST_SIZE 20
44a8966b67SGreg Tucker
45a8966b67SGreg Tucker typedef uint32_t (*checksum32_func_t)(uint32_t, const unsigned char *, uint64_t);
46a8966b67SGreg Tucker
47a8966b67SGreg Tucker typedef struct func_case {
48a8966b67SGreg Tucker char *note;
49a8966b67SGreg Tucker checksum32_func_t checksum32_func_call;
50a8966b67SGreg Tucker checksum32_func_t checksum32_ref_call;
51a8966b67SGreg Tucker } func_case_t;
52a8966b67SGreg Tucker
53a8966b67SGreg Tucker func_case_t test_funcs[] = {
54a8966b67SGreg Tucker { "checksum32_adler", isal_adler32, adler_ref },
55a8966b67SGreg Tucker };
56a8966b67SGreg Tucker
57a8966b67SGreg Tucker // Generates pseudo-random data
58a8966b67SGreg Tucker
59*55fbfabfSMarcel Cornu void
rand_buffer(unsigned char * buf,long buffer_size)60*55fbfabfSMarcel Cornu rand_buffer(unsigned char *buf, long buffer_size)
61a8966b67SGreg Tucker {
62a8966b67SGreg Tucker long i;
63a8966b67SGreg Tucker for (i = 0; i < buffer_size; i++)
64a8966b67SGreg Tucker buf[i] = rand();
65a8966b67SGreg Tucker }
66a8966b67SGreg Tucker
67a8966b67SGreg Tucker // Test cases
68*55fbfabfSMarcel Cornu int
69*55fbfabfSMarcel Cornu zeros_test(func_case_t *test_func);
70*55fbfabfSMarcel Cornu int
71*55fbfabfSMarcel Cornu simple_pattern_test(func_case_t *test_func);
72*55fbfabfSMarcel Cornu int
73*55fbfabfSMarcel Cornu seeds_sizes_test(func_case_t *test_func);
74*55fbfabfSMarcel Cornu int
75*55fbfabfSMarcel Cornu eob_test(func_case_t *test_func);
76*55fbfabfSMarcel Cornu int
77*55fbfabfSMarcel Cornu update_test(func_case_t *test_func);
78*55fbfabfSMarcel Cornu int
79*55fbfabfSMarcel Cornu update_over_mod_test(func_case_t *test_func);
80a8966b67SGreg Tucker
81a8966b67SGreg Tucker void *buf_alloc = NULL;
82a8966b67SGreg Tucker
83*55fbfabfSMarcel Cornu int
main(int argc,char * argv[])84*55fbfabfSMarcel Cornu main(int argc, char *argv[])
85a8966b67SGreg Tucker {
86a8966b67SGreg Tucker int fail = 0, fail_case;
87a8966b67SGreg Tucker int i, ret;
88a8966b67SGreg Tucker func_case_t *test_func;
89a8966b67SGreg Tucker
90a8966b67SGreg Tucker // Align to MAX_BUF boundary
91a8966b67SGreg Tucker ret = posix_memalign(&buf_alloc, MAX_BUF, MAX_BUF * TEST_SIZE);
92a8966b67SGreg Tucker if (ret) {
93a8966b67SGreg Tucker printf("alloc error: Fail");
94a8966b67SGreg Tucker return -1;
95a8966b67SGreg Tucker }
96a8966b67SGreg Tucker srand(TEST_SEED);
97a8966b67SGreg Tucker printf("CHECKSUM32 Tests seed=0x%x\n", TEST_SEED);
98a8966b67SGreg Tucker
99a8966b67SGreg Tucker for (i = 0; i < sizeof(test_funcs) / sizeof(test_funcs[0]); i++) {
100a8966b67SGreg Tucker fail_case = 0;
101a8966b67SGreg Tucker test_func = &test_funcs[i];
102a8966b67SGreg Tucker
103a8966b67SGreg Tucker printf("Test %s ", test_func->note);
104a8966b67SGreg Tucker fail_case += zeros_test(test_func);
105a8966b67SGreg Tucker fail_case += simple_pattern_test(test_func);
106a8966b67SGreg Tucker fail_case += seeds_sizes_test(test_func);
107a8966b67SGreg Tucker fail_case += eob_test(test_func);
108a8966b67SGreg Tucker fail_case += update_test(test_func);
109a8966b67SGreg Tucker fail_case += update_over_mod_test(test_func);
110a8966b67SGreg Tucker printf("Test %s done: %s\n", test_func->note, fail_case ? "Fail" : "Pass");
111a8966b67SGreg Tucker
112a8966b67SGreg Tucker if (fail_case) {
113a8966b67SGreg Tucker printf("\n%s Failed %d tests\n", test_func->note, fail_case);
114a8966b67SGreg Tucker fail++;
115a8966b67SGreg Tucker }
116a8966b67SGreg Tucker }
117a8966b67SGreg Tucker
118a8966b67SGreg Tucker printf("CHECKSUM32 Tests all done: %s\n", fail ? "Fail" : "Pass");
119a8966b67SGreg Tucker
120c06db0c6SPablo de Lara aligned_free(buf_alloc);
121c06db0c6SPablo de Lara
122a8966b67SGreg Tucker return fail;
123a8966b67SGreg Tucker }
124a8966b67SGreg Tucker
125a8966b67SGreg Tucker // Test of all zeros
126*55fbfabfSMarcel Cornu int
zeros_test(func_case_t * test_func)127*55fbfabfSMarcel Cornu zeros_test(func_case_t *test_func)
128a8966b67SGreg Tucker {
129a8966b67SGreg Tucker uint32_t c_dut, c_ref;
130a8966b67SGreg Tucker int fail = 0;
131a8966b67SGreg Tucker unsigned char *buf = NULL;
132a8966b67SGreg Tucker
133a8966b67SGreg Tucker buf = (unsigned char *) buf_alloc;
134a8966b67SGreg Tucker memset(buf, 0, MAX_BUF * 10);
135a8966b67SGreg Tucker c_dut = test_func->checksum32_func_call(TEST_SEED, buf, MAX_BUF * 10);
136a8966b67SGreg Tucker c_ref = test_func->checksum32_ref_call(TEST_SEED, buf, MAX_BUF * 10);
137a8966b67SGreg Tucker
138a8966b67SGreg Tucker if (c_dut != c_ref) {
139a8966b67SGreg Tucker fail++;
140a8966b67SGreg Tucker printf("\n opt ref\n");
141a8966b67SGreg Tucker printf(" ------ ------\n");
142a8966b67SGreg Tucker printf("checksum zero = 0x%8x 0x%8x \n", c_dut, c_ref);
1432ca781dfSPablo de Lara }
1442ca781dfSPablo de Lara #ifdef TEST_VERBOSE
1452ca781dfSPablo de Lara else
146a8966b67SGreg Tucker printf(".");
1472ca781dfSPablo de Lara #endif
148a8966b67SGreg Tucker
149a8966b67SGreg Tucker return fail;
150a8966b67SGreg Tucker }
151a8966b67SGreg Tucker
152a8966b67SGreg Tucker // Another simple test pattern
153*55fbfabfSMarcel Cornu int
simple_pattern_test(func_case_t * test_func)154*55fbfabfSMarcel Cornu simple_pattern_test(func_case_t *test_func)
155a8966b67SGreg Tucker {
156a8966b67SGreg Tucker uint32_t c_dut, c_ref;
157a8966b67SGreg Tucker int fail = 0;
158a8966b67SGreg Tucker unsigned char *buf = NULL;
159a8966b67SGreg Tucker
160a8966b67SGreg Tucker buf = (unsigned char *) buf_alloc;
161a8966b67SGreg Tucker memset(buf, 0x8a, MAX_BUF);
162a8966b67SGreg Tucker c_dut = test_func->checksum32_func_call(TEST_SEED, buf, MAX_BUF);
163a8966b67SGreg Tucker c_ref = test_func->checksum32_ref_call(TEST_SEED, buf, MAX_BUF);
1642ca781dfSPablo de Lara if (c_dut != c_ref) {
165a8966b67SGreg Tucker fail++;
1662ca781dfSPablo de Lara printf("fail checksum all 8a = 0x%8x 0x%8x\n", c_dut, c_ref);
1672ca781dfSPablo de Lara }
1682ca781dfSPablo de Lara #ifdef TEST_VERBOSE
169a8966b67SGreg Tucker else
170a8966b67SGreg Tucker printf(".");
1712ca781dfSPablo de Lara #endif
172a8966b67SGreg Tucker
173a8966b67SGreg Tucker return fail;
174a8966b67SGreg Tucker }
175a8966b67SGreg Tucker
176*55fbfabfSMarcel Cornu int
seeds_sizes_test(func_case_t * test_func)177*55fbfabfSMarcel Cornu seeds_sizes_test(func_case_t *test_func)
178a8966b67SGreg Tucker {
179a8966b67SGreg Tucker uint32_t c_dut, c_ref;
180a8966b67SGreg Tucker int fail = 0;
181a8966b67SGreg Tucker int i;
182a8966b67SGreg Tucker uint32_t r, s;
183a8966b67SGreg Tucker unsigned char *buf = NULL;
184a8966b67SGreg Tucker
185a8966b67SGreg Tucker // Do a few random tests
186a8966b67SGreg Tucker buf = (unsigned char *) buf_alloc; // reset buf
187a8966b67SGreg Tucker r = rand();
188a8966b67SGreg Tucker rand_buffer(buf, MAX_BUF * TEST_SIZE);
189a8966b67SGreg Tucker
190a8966b67SGreg Tucker for (i = 0; i < TEST_SIZE; i++) {
191a8966b67SGreg Tucker c_dut = test_func->checksum32_func_call(r, buf, MAX_BUF);
192a8966b67SGreg Tucker c_ref = test_func->checksum32_ref_call(r, buf, MAX_BUF);
1932ca781dfSPablo de Lara if (c_dut != c_ref) {
194a8966b67SGreg Tucker fail++;
1952ca781dfSPablo de Lara printf("fail checksum rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
1962ca781dfSPablo de Lara }
1972ca781dfSPablo de Lara #ifdef TEST_VERBOSE
198a8966b67SGreg Tucker else
199a8966b67SGreg Tucker printf(".");
2002ca781dfSPablo de Lara #endif
201a8966b67SGreg Tucker buf += MAX_BUF;
202a8966b67SGreg Tucker }
203a8966b67SGreg Tucker
204a8966b67SGreg Tucker // Do a few random sizes
205a8966b67SGreg Tucker buf = (unsigned char *) buf_alloc; // reset buf
206a8966b67SGreg Tucker r = rand();
207a8966b67SGreg Tucker
208a8966b67SGreg Tucker for (i = MAX_BUF; i >= 0; i--) {
209a8966b67SGreg Tucker c_dut = test_func->checksum32_func_call(r, buf, i);
210a8966b67SGreg Tucker c_ref = test_func->checksum32_ref_call(r, buf, i);
211a8966b67SGreg Tucker if (c_dut != c_ref) {
212a8966b67SGreg Tucker fail++;
213a8966b67SGreg Tucker printf("fail random size%i 0x%8x 0x%8x\n", i, c_dut, c_ref);
2142ca781dfSPablo de Lara }
2152ca781dfSPablo de Lara #ifdef TEST_VERBOSE
2162ca781dfSPablo de Lara else
217a8966b67SGreg Tucker printf(".");
2182ca781dfSPablo de Lara #endif
219a8966b67SGreg Tucker }
220a8966b67SGreg Tucker
221a8966b67SGreg Tucker // Try different seeds
222a8966b67SGreg Tucker for (s = 0; s < 20; s++) {
223a8966b67SGreg Tucker buf = (unsigned char *) buf_alloc; // reset buf
224a8966b67SGreg Tucker
225a8966b67SGreg Tucker r = rand(); // just to get a new seed
226a8966b67SGreg Tucker rand_buffer(buf, MAX_BUF * TEST_SIZE); // new pseudo-rand data
227a8966b67SGreg Tucker
2282ca781dfSPablo de Lara #ifdef TEST_VERBOSE
229a8966b67SGreg Tucker printf("seed = 0x%x\n", r);
2302ca781dfSPablo de Lara #endif
231a8966b67SGreg Tucker
232a8966b67SGreg Tucker for (i = 0; i < TEST_SIZE; i++) {
233a8966b67SGreg Tucker c_dut = test_func->checksum32_func_call(r, buf, MAX_BUF);
234a8966b67SGreg Tucker c_ref = test_func->checksum32_ref_call(r, buf, MAX_BUF);
2352ca781dfSPablo de Lara if (c_dut != c_ref) {
236a8966b67SGreg Tucker fail++;
237*55fbfabfSMarcel Cornu printf("fail checksum rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
2382ca781dfSPablo de Lara }
2392ca781dfSPablo de Lara #ifdef TEST_VERBOSE
240a8966b67SGreg Tucker else
241a8966b67SGreg Tucker printf(".");
2422ca781dfSPablo de Lara #endif
243a8966b67SGreg Tucker buf += MAX_BUF;
244a8966b67SGreg Tucker }
245a8966b67SGreg Tucker }
246a8966b67SGreg Tucker
247a8966b67SGreg Tucker return fail;
248a8966b67SGreg Tucker }
249a8966b67SGreg Tucker
250a8966b67SGreg Tucker // Run tests at end of buffer
251*55fbfabfSMarcel Cornu int
eob_test(func_case_t * test_func)252*55fbfabfSMarcel Cornu eob_test(func_case_t *test_func)
253a8966b67SGreg Tucker {
254a8966b67SGreg Tucker uint32_t c_dut, c_ref;
255a8966b67SGreg Tucker int fail = 0;
256a8966b67SGreg Tucker int i;
257a8966b67SGreg Tucker unsigned char *buf = NULL;
258a8966b67SGreg Tucker
259a8966b67SGreg Tucker buf = (unsigned char *) buf_alloc; // reset buf
260a8966b67SGreg Tucker buf = buf + ((MAX_BUF - 1) * TEST_SIZE); // Line up TEST_SIZE from end
261a8966b67SGreg Tucker for (i = 0; i < TEST_SIZE; i++) {
262a8966b67SGreg Tucker c_dut = test_func->checksum32_func_call(TEST_SEED, buf + i, TEST_SIZE - i);
263a8966b67SGreg Tucker c_ref = test_func->checksum32_ref_call(TEST_SEED, buf + i, TEST_SIZE - i);
2642ca781dfSPablo de Lara if (c_dut != c_ref) {
265a8966b67SGreg Tucker fail++;
2662ca781dfSPablo de Lara printf("fail checksum eob rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
2672ca781dfSPablo de Lara }
2682ca781dfSPablo de Lara #ifdef TEST_VERBOSE
269a8966b67SGreg Tucker else
270a8966b67SGreg Tucker printf(".");
2712ca781dfSPablo de Lara #endif
272a8966b67SGreg Tucker }
273a8966b67SGreg Tucker
274a8966b67SGreg Tucker return fail;
275a8966b67SGreg Tucker }
276a8966b67SGreg Tucker
277*55fbfabfSMarcel Cornu int
update_test(func_case_t * test_func)278*55fbfabfSMarcel Cornu update_test(func_case_t *test_func)
279a8966b67SGreg Tucker {
280a8966b67SGreg Tucker uint32_t c_dut, c_ref;
281a8966b67SGreg Tucker int fail = 0;
282a8966b67SGreg Tucker int i;
283a8966b67SGreg Tucker uint32_t r;
284a8966b67SGreg Tucker unsigned char *buf = NULL;
285a8966b67SGreg Tucker
286a8966b67SGreg Tucker buf = (unsigned char *) buf_alloc; // reset buf
287a8966b67SGreg Tucker r = rand();
288a8966b67SGreg Tucker // Process the whole buf with reference func single call.
289a8966b67SGreg Tucker c_ref = test_func->checksum32_ref_call(r, buf, MAX_BUF * TEST_SIZE);
290a8966b67SGreg Tucker // Process buf with update method.
291a8966b67SGreg Tucker for (i = 0; i < TEST_SIZE; i++) {
292a8966b67SGreg Tucker c_dut = test_func->checksum32_func_call(r, buf, MAX_BUF);
293a8966b67SGreg Tucker // Update checksum seeds and buf pointer.
294a8966b67SGreg Tucker r = c_dut;
295a8966b67SGreg Tucker buf += MAX_BUF;
296a8966b67SGreg Tucker }
297a8966b67SGreg Tucker
2982ca781dfSPablo de Lara if (c_dut != c_ref) {
299a8966b67SGreg Tucker fail++;
300a8966b67SGreg Tucker printf("checksum rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
3012ca781dfSPablo de Lara }
3022ca781dfSPablo de Lara #ifdef TEST_VERBOSE
303a8966b67SGreg Tucker else
304a8966b67SGreg Tucker printf(".");
3052ca781dfSPablo de Lara #endif
306a8966b67SGreg Tucker
307a8966b67SGreg Tucker return fail;
308a8966b67SGreg Tucker }
309a8966b67SGreg Tucker
310*55fbfabfSMarcel Cornu int
update_over_mod_test(func_case_t * test_func)311*55fbfabfSMarcel Cornu update_over_mod_test(func_case_t *test_func)
312a8966b67SGreg Tucker {
313a8966b67SGreg Tucker uint32_t c_dut, c_ref;
314a8966b67SGreg Tucker int fail = 0;
315a8966b67SGreg Tucker int i;
316a8966b67SGreg Tucker unsigned char *buf = NULL;
317a8966b67SGreg Tucker
318a8966b67SGreg Tucker buf = malloc(ADLER_MOD);
3195a00eaecSTomasz Kantecki if (buf == NULL)
3205a00eaecSTomasz Kantecki return 1;
321a8966b67SGreg Tucker memset(buf, 0xff, ADLER_MOD);
322a8966b67SGreg Tucker
323a8966b67SGreg Tucker c_ref = c_dut = rand();
324a8966b67SGreg Tucker
325a8966b67SGreg Tucker // Process buf with update method.
326a8966b67SGreg Tucker for (i = 0; i < 20; i++) {
327a8966b67SGreg Tucker c_ref = test_func->checksum32_ref_call(c_ref, buf, ADLER_MOD - 64);
328a8966b67SGreg Tucker c_dut = test_func->checksum32_func_call(c_dut, buf, ADLER_MOD - 64);
329a8966b67SGreg Tucker }
330a8966b67SGreg Tucker
3312ca781dfSPablo de Lara if (c_dut != c_ref) {
332a8966b67SGreg Tucker fail++;
333a8966b67SGreg Tucker printf("checksum rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
3342ca781dfSPablo de Lara }
3352ca781dfSPablo de Lara #ifdef TEST_VERBOSE
336a8966b67SGreg Tucker else
337a8966b67SGreg Tucker printf(".");
3382ca781dfSPablo de Lara #endif
339a8966b67SGreg Tucker
340a8966b67SGreg Tucker free(buf);
341a8966b67SGreg Tucker return fail;
342a8966b67SGreg Tucker }
343