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