xref: /isa-l/igzip/igzip_inflate_test.c (revision 09a5a243bfec3ba0945a2bc7bfdb07e1d105e6af)
1660f49b0SGreg Tucker /**********************************************************************
2660f49b0SGreg Tucker   Copyright(c) 2011-2016 Intel Corporation All rights reserved.
3660f49b0SGreg Tucker 
4660f49b0SGreg Tucker   Redistribution and use in source and binary forms, with or without
5660f49b0SGreg Tucker   modification, are permitted provided that the following conditions
6660f49b0SGreg Tucker   are met:
7660f49b0SGreg Tucker     * Redistributions of source code must retain the above copyright
8660f49b0SGreg Tucker       notice, this list of conditions and the following disclaimer.
9660f49b0SGreg Tucker     * Redistributions in binary form must reproduce the above copyright
10660f49b0SGreg Tucker       notice, this list of conditions and the following disclaimer in
11660f49b0SGreg Tucker       the documentation and/or other materials provided with the
12660f49b0SGreg Tucker       distribution.
13660f49b0SGreg Tucker     * Neither the name of Intel Corporation nor the names of its
14660f49b0SGreg Tucker       contributors may be used to endorse or promote products derived
15660f49b0SGreg Tucker       from this software without specific prior written permission.
16660f49b0SGreg Tucker 
17660f49b0SGreg Tucker   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18660f49b0SGreg Tucker   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19660f49b0SGreg Tucker   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20660f49b0SGreg Tucker   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21660f49b0SGreg Tucker   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22660f49b0SGreg Tucker   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23660f49b0SGreg Tucker   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24660f49b0SGreg Tucker   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25660f49b0SGreg Tucker   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26660f49b0SGreg Tucker   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27660f49b0SGreg Tucker   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28660f49b0SGreg Tucker **********************************************************************/
29660f49b0SGreg Tucker 
30660f49b0SGreg Tucker #include <stdint.h>
31660f49b0SGreg Tucker #include <stdio.h>
32660f49b0SGreg Tucker #include <zlib.h>
33*09a5a243SRoy Oursler #include "inflate.h"
34660f49b0SGreg Tucker #include "huff_codes.h"
35660f49b0SGreg Tucker 
36*09a5a243SRoy Oursler #define OUT_BUFFER_SLOP 16
37*09a5a243SRoy Oursler 
38660f49b0SGreg Tucker /*Don't use file larger memory can support because compression and decompression
39660f49b0SGreg Tucker  * are done in a stateless manner. */
40660f49b0SGreg Tucker #define MAX_INPUT_FILE_SIZE 2L*1024L*1024L*1024L
41660f49b0SGreg Tucker 
42660f49b0SGreg Tucker int test(uint8_t * compressed_stream, uint64_t * compressed_length,
43660f49b0SGreg Tucker 	 uint8_t * uncompressed_stream, int uncompressed_length,
44*09a5a243SRoy Oursler 	 uint8_t * uncompressed_test_stream, int uncompressed_test_stream_length)
45660f49b0SGreg Tucker {
46660f49b0SGreg Tucker 	struct inflate_state state;
47660f49b0SGreg Tucker 	int ret;
48660f49b0SGreg Tucker 	ret =
49660f49b0SGreg Tucker 	    compress2(compressed_stream, compressed_length, uncompressed_stream,
50660f49b0SGreg Tucker 		      uncompressed_length, 9);
51660f49b0SGreg Tucker 	if (ret) {
52660f49b0SGreg Tucker 		printf("Failed compressing input with exit code %d", ret);
53660f49b0SGreg Tucker 		return ret;
54660f49b0SGreg Tucker 	}
55660f49b0SGreg Tucker 
56*09a5a243SRoy Oursler 	isal_inflate_init(&state, compressed_stream + 2, *compressed_length - 2,
57*09a5a243SRoy Oursler 			  uncompressed_test_stream, uncompressed_test_stream_length);
58*09a5a243SRoy Oursler 	ret = isal_inflate_stateless(&state);
59660f49b0SGreg Tucker 
60660f49b0SGreg Tucker 	switch (ret) {
61660f49b0SGreg Tucker 	case 0:
62660f49b0SGreg Tucker 		break;
63660f49b0SGreg Tucker 	case END_OF_INPUT:
64660f49b0SGreg Tucker 		printf(" did not decompress all input\n");
65660f49b0SGreg Tucker 		return END_OF_INPUT;
66660f49b0SGreg Tucker 		break;
67660f49b0SGreg Tucker 	case INVALID_BLOCK_HEADER:
68660f49b0SGreg Tucker 		printf("  invalid header\n");
69660f49b0SGreg Tucker 		return INVALID_BLOCK_HEADER;
70660f49b0SGreg Tucker 		break;
71660f49b0SGreg Tucker 	case INVALID_SYMBOL:
72660f49b0SGreg Tucker 		printf(" invalid symbol\n");
73660f49b0SGreg Tucker 		return INVALID_SYMBOL;
74660f49b0SGreg Tucker 		break;
75660f49b0SGreg Tucker 	case OUT_BUFFER_OVERFLOW:
76660f49b0SGreg Tucker 		printf(" out buffer overflow\n");
77660f49b0SGreg Tucker 		return OUT_BUFFER_OVERFLOW;
78660f49b0SGreg Tucker 		break;
79660f49b0SGreg Tucker 	case INVALID_NON_COMPRESSED_BLOCK_LENGTH:
80660f49b0SGreg Tucker 		printf("Invalid length bits in non-compressed block\n");
81660f49b0SGreg Tucker 		return INVALID_NON_COMPRESSED_BLOCK_LENGTH;
82660f49b0SGreg Tucker 		break;
83660f49b0SGreg Tucker 	case INVALID_LOOK_BACK_DISTANCE:
84660f49b0SGreg Tucker 		printf("Invalid lookback distance");
85660f49b0SGreg Tucker 		return INVALID_LOOK_BACK_DISTANCE;
86660f49b0SGreg Tucker 		break;
87660f49b0SGreg Tucker 	default:
88660f49b0SGreg Tucker 		printf(" error\n");
89660f49b0SGreg Tucker 		return -1;
90660f49b0SGreg Tucker 		break;
91660f49b0SGreg Tucker 	}
92660f49b0SGreg Tucker 
93660f49b0SGreg Tucker 	if (state.out_buffer.total_out != uncompressed_length) {
94660f49b0SGreg Tucker 		printf("incorrect amount of data was decompressed from compressed data\n");
95660f49b0SGreg Tucker 		printf("%d decompressed of %d compressed", state.out_buffer.total_out,
96660f49b0SGreg Tucker 		       uncompressed_length);
97660f49b0SGreg Tucker 		return -1;
98660f49b0SGreg Tucker 	}
99660f49b0SGreg Tucker 	if (memcmp(uncompressed_stream, uncompressed_test_stream, uncompressed_length)) {
100*09a5a243SRoy Oursler 		int i;
101*09a5a243SRoy Oursler 		for (i = 0; i < uncompressed_length; i++) {
102*09a5a243SRoy Oursler 			if (uncompressed_stream[i] != uncompressed_test_stream[i]) {
103*09a5a243SRoy Oursler 				printf("first error at %d, 0x%x != 0x%x\n", i,
104*09a5a243SRoy Oursler 				       uncompressed_stream[i], uncompressed_test_stream[i]);
105*09a5a243SRoy Oursler 			}
106*09a5a243SRoy Oursler 		}
107660f49b0SGreg Tucker 		printf(" decompressed data is not the same as the compressed data\n");
108660f49b0SGreg Tucker 		return -1;
109660f49b0SGreg Tucker 	}
110660f49b0SGreg Tucker 	return 0;
111660f49b0SGreg Tucker }
112660f49b0SGreg Tucker 
113660f49b0SGreg Tucker int main(int argc, char **argv)
114660f49b0SGreg Tucker {
115660f49b0SGreg Tucker 	int i, j, ret = 0, fin_ret = 0;
116*09a5a243SRoy Oursler 	FILE *file = NULL;
117*09a5a243SRoy Oursler 	uint64_t compressed_length, file_length;
118*09a5a243SRoy Oursler 	uint64_t uncompressed_length, uncompressed_test_stream_length;
119*09a5a243SRoy Oursler 	uint8_t *uncompressed_stream = NULL;
120*09a5a243SRoy Oursler 	uint8_t *compressed_stream = NULL;
121*09a5a243SRoy Oursler 	uint8_t *uncompressed_test_stream = NULL;
122660f49b0SGreg Tucker 
123660f49b0SGreg Tucker 	if (argc == 1)
124660f49b0SGreg Tucker 		printf("Error, no input file\n");
125660f49b0SGreg Tucker 
126660f49b0SGreg Tucker 	for (i = 1; i < argc; i++) {
127660f49b0SGreg Tucker 		file = fopen(argv[i], "r");
128660f49b0SGreg Tucker 		if (file == NULL) {
129660f49b0SGreg Tucker 			printf("Error opening file %s\n", argv[i]);
130660f49b0SGreg Tucker 			return 1;
131660f49b0SGreg Tucker 		} else
132660f49b0SGreg Tucker 			printf("Starting file %s", argv[i]);
133660f49b0SGreg Tucker 
134660f49b0SGreg Tucker 		fseek(file, 0, SEEK_END);
135660f49b0SGreg Tucker 		file_length = ftell(file);
136660f49b0SGreg Tucker 		fseek(file, 0, SEEK_SET);
137660f49b0SGreg Tucker 		file_length -= ftell(file);
138660f49b0SGreg Tucker 		if (file_length > MAX_INPUT_FILE_SIZE) {
139660f49b0SGreg Tucker 			printf("File too large to run on this test\n");
140660f49b0SGreg Tucker 			fclose(file);
141660f49b0SGreg Tucker 			continue;
142660f49b0SGreg Tucker 		}
143660f49b0SGreg Tucker 
144*09a5a243SRoy Oursler 		compressed_length = compressBound(file_length);
145*09a5a243SRoy Oursler 		if (file_length != 0) {
146*09a5a243SRoy Oursler 			uncompressed_stream = malloc(file_length);
147*09a5a243SRoy Oursler 			uncompressed_test_stream = malloc(file_length);
148*09a5a243SRoy Oursler 		}
149*09a5a243SRoy Oursler 		compressed_stream = malloc(compressed_length);
150*09a5a243SRoy Oursler 
151*09a5a243SRoy Oursler 		if (uncompressed_stream == NULL && file_length != 0) {
152660f49b0SGreg Tucker 			printf("Failed to allocate memory\n");
153660f49b0SGreg Tucker 			exit(0);
154660f49b0SGreg Tucker 		}
155660f49b0SGreg Tucker 
156660f49b0SGreg Tucker 		if (compressed_stream == NULL) {
157660f49b0SGreg Tucker 			printf("Failed to allocate memory\n");
158660f49b0SGreg Tucker 			exit(0);
159660f49b0SGreg Tucker 		}
160660f49b0SGreg Tucker 
161660f49b0SGreg Tucker 		if (uncompressed_test_stream == NULL) {
162660f49b0SGreg Tucker 			printf("Failed to allocate memory\n");
163660f49b0SGreg Tucker 			exit(0);
164660f49b0SGreg Tucker 		}
165660f49b0SGreg Tucker 
166660f49b0SGreg Tucker 		uncompressed_length = fread(uncompressed_stream, 1, file_length, file);
167*09a5a243SRoy Oursler 		uncompressed_test_stream_length = uncompressed_length + OUT_BUFFER_SLOP;
168*09a5a243SRoy Oursler 
169660f49b0SGreg Tucker 		ret =
170660f49b0SGreg Tucker 		    test(compressed_stream, &compressed_length, uncompressed_stream,
171*09a5a243SRoy Oursler 			 uncompressed_length, uncompressed_test_stream,
172*09a5a243SRoy Oursler 			 uncompressed_test_stream_length);
173660f49b0SGreg Tucker 		if (ret) {
174660f49b0SGreg Tucker 			for (j = 0; j < compressed_length; j++) {
175660f49b0SGreg Tucker 				if ((j & 31) == 0)
176660f49b0SGreg Tucker 					printf("\n");
177660f49b0SGreg Tucker 				else
178660f49b0SGreg Tucker 					printf(" ");
179660f49b0SGreg Tucker 				printf("0x%02x,", compressed_stream[j]);
180660f49b0SGreg Tucker 
181660f49b0SGreg Tucker 			}
182660f49b0SGreg Tucker 			printf("\n");
183660f49b0SGreg Tucker 
184660f49b0SGreg Tucker 		}
185660f49b0SGreg Tucker 
186*09a5a243SRoy Oursler 		fflush(0);
187660f49b0SGreg Tucker 		fclose(file);
188660f49b0SGreg Tucker 		free(compressed_stream);
189*09a5a243SRoy Oursler 		if (uncompressed_stream != NULL)
190660f49b0SGreg Tucker 			free(uncompressed_stream);
191*09a5a243SRoy Oursler 		if (uncompressed_test_stream != NULL)
192660f49b0SGreg Tucker 			free(uncompressed_test_stream);
193660f49b0SGreg Tucker 
194660f49b0SGreg Tucker 		if (ret) {
195660f49b0SGreg Tucker 			printf(" ... Fail with exit code %d\n", ret);
196660f49b0SGreg Tucker 			return ret;
197660f49b0SGreg Tucker 		} else
198660f49b0SGreg Tucker 			printf(" ... Pass\n");
199660f49b0SGreg Tucker 
200660f49b0SGreg Tucker 		fin_ret |= ret;
201660f49b0SGreg Tucker 	}
202660f49b0SGreg Tucker 	return fin_ret;
203660f49b0SGreg Tucker }
204