xref: /isa-l/igzip/checksum32_funcs_test.c (revision 55fbfabfc60f1002bc8133b730a59f6abd22cfce)
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