mirror of
https://github.com/lz4/lz4.git
synced 2024-11-24 18:33:50 +08:00
Merge pull request #499 from felixhandte/lz4-attach-dict-tests
Test LZ4_attach_dictionary() and Friends
This commit is contained in:
commit
2cb9c9034a
101
tests/fuzzer.c
101
tests/fuzzer.c
@ -43,6 +43,7 @@
|
|||||||
#include <stdio.h> /* fgets, sscanf */
|
#include <stdio.h> /* fgets, sscanf */
|
||||||
#include <string.h> /* strcmp */
|
#include <string.h> /* strcmp */
|
||||||
#include <time.h> /* clock_t, clock, CLOCKS_PER_SEC */
|
#include <time.h> /* clock_t, clock, CLOCKS_PER_SEC */
|
||||||
|
#define LZ4_STATIC_LINKING_ONLY
|
||||||
#define LZ4_HC_STATIC_LINKING_ONLY
|
#define LZ4_HC_STATIC_LINKING_ONLY
|
||||||
#include "lz4hc.h"
|
#include "lz4hc.h"
|
||||||
#define XXH_STATIC_LINKING_ONLY
|
#define XXH_STATIC_LINKING_ONLY
|
||||||
@ -302,9 +303,9 @@ static int FUZ_test(U32 seed, U32 nbCycles, const U32 startCycle, const double c
|
|||||||
U32 testNb = 0;
|
U32 testNb = 0;
|
||||||
U32 randState = FUZ_rand(&coreRandState) ^ PRIME3;
|
U32 randState = FUZ_rand(&coreRandState) ^ PRIME3;
|
||||||
int const blockSize = (FUZ_rand(&randState) % (FUZ_MAX_BLOCK_SIZE-1)) + 1;
|
int const blockSize = (FUZ_rand(&randState) % (FUZ_MAX_BLOCK_SIZE-1)) + 1;
|
||||||
int const blockStart = FUZ_rand(&randState) % (COMPRESSIBLE_NOISE_LENGTH - blockSize);
|
int const blockStart = (FUZ_rand(&randState) % (COMPRESSIBLE_NOISE_LENGTH - blockSize - 1)) + 1;
|
||||||
int const dictSizeRand = FUZ_rand(&randState) % FUZ_MAX_DICT_SIZE;
|
int const dictSizeRand = FUZ_rand(&randState) % FUZ_MAX_DICT_SIZE;
|
||||||
int const dictSize = MIN(dictSizeRand, blockStart);
|
int const dictSize = MIN(dictSizeRand, blockStart - 1);
|
||||||
int const compressionLevel = FUZ_rand(&randState) % (LZ4HC_CLEVEL_MAX+1);
|
int const compressionLevel = FUZ_rand(&randState) % (LZ4HC_CLEVEL_MAX+1);
|
||||||
char* const block = ((char*)CNBuffer) + blockStart;
|
char* const block = ((char*)CNBuffer) + blockStart;
|
||||||
const char* dict = block - dictSize;
|
const char* dict = block - dictSize;
|
||||||
@ -402,6 +403,11 @@ static int FUZ_test(U32 seed, U32 nbCycles, const U32 startCycle, const double c
|
|||||||
ret = LZ4_compress_fast_extState(stateLZ4, block, compressedBuffer, blockSize, (int)compressedBufferSize, 8);
|
ret = LZ4_compress_fast_extState(stateLZ4, block, compressedBuffer, blockSize, (int)compressedBufferSize, 8);
|
||||||
FUZ_CHECKTEST(ret==0, "LZ4_compress_fast_extState() failed");
|
FUZ_CHECKTEST(ret==0, "LZ4_compress_fast_extState() failed");
|
||||||
|
|
||||||
|
/* Test compression using fast reset external state*/
|
||||||
|
FUZ_DISPLAYTEST;
|
||||||
|
ret = LZ4_compress_fast_extState_fastReset(stateLZ4, block, compressedBuffer, blockSize, (int)compressedBufferSize, 8);
|
||||||
|
FUZ_CHECKTEST(ret==0, "LZ4_compress_fast_extState_fastReset() failed");
|
||||||
|
|
||||||
/* Test compression */
|
/* Test compression */
|
||||||
FUZ_DISPLAYTEST;
|
FUZ_DISPLAYTEST;
|
||||||
ret = LZ4_compress_default(block, compressedBuffer, blockSize, (int)compressedBufferSize);
|
ret = LZ4_compress_default(block, compressedBuffer, blockSize, (int)compressedBufferSize);
|
||||||
@ -626,6 +632,97 @@ static int FUZ_test(U32 seed, U32 nbCycles, const U32 startCycle, const double c
|
|||||||
FUZ_CHECKTEST(decodedBuffer[blockSize-missingBytes], "LZ4_decompress_safe_usingDict overrun specified output buffer size (-%u byte) (blockSize=%i)", missingBytes, blockSize);
|
FUZ_CHECKTEST(decodedBuffer[blockSize-missingBytes], "LZ4_decompress_safe_usingDict overrun specified output buffer size (-%u byte) (blockSize=%i)", missingBytes, blockSize);
|
||||||
} }
|
} }
|
||||||
|
|
||||||
|
/* Compress using external dictionary stream */
|
||||||
|
FUZ_DISPLAYTEST;
|
||||||
|
{
|
||||||
|
LZ4_stream_t LZ4_stream;
|
||||||
|
int expectedSize;
|
||||||
|
U32 expectedCrc;
|
||||||
|
|
||||||
|
LZ4_loadDict(&LZ4dict, dict, dictSize);
|
||||||
|
expectedSize = LZ4_compress_fast_continue(&LZ4dict, block, compressedBuffer, blockSize, (int)compressedBufferSize, 1);
|
||||||
|
FUZ_CHECKTEST(expectedSize<=0, "LZ4_compress_fast_continue reference compression for extDictCtx should have succeeded");
|
||||||
|
expectedCrc = XXH32(compressedBuffer, expectedSize, 0);
|
||||||
|
|
||||||
|
LZ4_loadDict(&LZ4dict, dict, dictSize);
|
||||||
|
|
||||||
|
LZ4_resetStream(&LZ4_stream);
|
||||||
|
LZ4_attach_dictionary(&LZ4_stream, &LZ4dict);
|
||||||
|
blockContinueCompressedSize = LZ4_compress_fast_continue(&LZ4_stream, block, compressedBuffer, blockSize, (int)compressedBufferSize, 1);
|
||||||
|
FUZ_CHECKTEST(blockContinueCompressedSize==0, "LZ4_compress_fast_continue using extDictCtx failed");
|
||||||
|
|
||||||
|
/* In the future, it might be desirable to let extDictCtx mode's
|
||||||
|
* output diverge from the output generated by regular extDict mode.
|
||||||
|
* Until that time, this comparison serves as a good regression
|
||||||
|
* test.
|
||||||
|
*/
|
||||||
|
FUZ_CHECKTEST(blockContinueCompressedSize != expectedSize, "LZ4_compress_fast_continue using extDictCtx produced different-sized output (%d expected vs %d actual)", expectedSize, blockContinueCompressedSize);
|
||||||
|
FUZ_CHECKTEST(XXH32(compressedBuffer, blockContinueCompressedSize, 0) != expectedCrc, "LZ4_compress_fast_continue using extDictCtx produced different output");
|
||||||
|
|
||||||
|
FUZ_DISPLAYTEST;
|
||||||
|
LZ4_resetStream(&LZ4_stream);
|
||||||
|
LZ4_attach_dictionary(&LZ4_stream, &LZ4dict);
|
||||||
|
ret = LZ4_compress_fast_continue(&LZ4_stream, block, compressedBuffer, blockSize, blockContinueCompressedSize-1, 1);
|
||||||
|
FUZ_CHECKTEST(ret>0, "LZ4_compress_fast_continue using extDictCtx should fail : one missing byte for output buffer : %i written, %i buffer", ret, blockContinueCompressedSize);
|
||||||
|
|
||||||
|
FUZ_DISPLAYTEST;
|
||||||
|
LZ4_resetStream(&LZ4_stream);
|
||||||
|
LZ4_attach_dictionary(&LZ4_stream, &LZ4dict);
|
||||||
|
ret = LZ4_compress_fast_continue(&LZ4_stream, block, compressedBuffer, blockSize, blockContinueCompressedSize, 1);
|
||||||
|
FUZ_CHECKTEST(ret!=blockContinueCompressedSize, "LZ4_compress_limitedOutput_compressed size is different (%i != %i)", ret, blockContinueCompressedSize);
|
||||||
|
FUZ_CHECKTEST(ret<=0, "LZ4_compress_fast_continue using extDictCtx should work : enough size available within output buffer");
|
||||||
|
FUZ_CHECKTEST(ret != expectedSize, "LZ4_compress_fast_continue using extDictCtx produced different-sized output");
|
||||||
|
FUZ_CHECKTEST(XXH32(compressedBuffer, ret, 0) != expectedCrc, "LZ4_compress_fast_continue using extDictCtx produced different output");
|
||||||
|
|
||||||
|
FUZ_DISPLAYTEST;
|
||||||
|
LZ4_resetStream_fast(&LZ4_stream);
|
||||||
|
LZ4_attach_dictionary(&LZ4_stream, &LZ4dict);
|
||||||
|
ret = LZ4_compress_fast_continue(&LZ4_stream, block, compressedBuffer, blockSize, blockContinueCompressedSize, 1);
|
||||||
|
FUZ_CHECKTEST(ret!=blockContinueCompressedSize, "LZ4_compress_limitedOutput_compressed size is different (%i != %i)", ret, blockContinueCompressedSize);
|
||||||
|
FUZ_CHECKTEST(ret<=0, "LZ4_compress_fast_continue using extDictCtx with re-used context should work : enough size available within output buffer");
|
||||||
|
FUZ_CHECKTEST(ret != expectedSize, "LZ4_compress_fast_continue using extDictCtx produced different-sized output");
|
||||||
|
FUZ_CHECKTEST(XXH32(compressedBuffer, ret, 0) != expectedCrc, "LZ4_compress_fast_continue using extDictCtx produced different output");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decompress with dictionary as external */
|
||||||
|
FUZ_DISPLAYTEST;
|
||||||
|
decodedBuffer[blockSize] = 0;
|
||||||
|
ret = LZ4_decompress_fast_usingDict(compressedBuffer, decodedBuffer, blockSize, dict, dictSize);
|
||||||
|
FUZ_CHECKTEST(ret!=blockContinueCompressedSize, "LZ4_decompress_fast_usingDict did not read all compressed block input");
|
||||||
|
FUZ_CHECKTEST(decodedBuffer[blockSize], "LZ4_decompress_fast_usingDict overrun specified output buffer size");
|
||||||
|
crcCheck = XXH32(decodedBuffer, blockSize, 0);
|
||||||
|
if (crcCheck!=crcOrig) FUZ_findDiff(block, decodedBuffer);
|
||||||
|
FUZ_CHECKTEST(crcCheck!=crcOrig, "LZ4_decompress_fast_usingDict corrupted decoded data (dict %i)", dictSize);
|
||||||
|
|
||||||
|
FUZ_DISPLAYTEST;
|
||||||
|
decodedBuffer[blockSize] = 0;
|
||||||
|
ret = LZ4_decompress_safe_usingDict(compressedBuffer, decodedBuffer, blockContinueCompressedSize, blockSize, dict, dictSize);
|
||||||
|
FUZ_CHECKTEST(ret!=blockSize, "LZ4_decompress_safe_usingDict did not regenerate original data");
|
||||||
|
FUZ_CHECKTEST(decodedBuffer[blockSize], "LZ4_decompress_safe_usingDict overrun specified output buffer size");
|
||||||
|
crcCheck = XXH32(decodedBuffer, blockSize, 0);
|
||||||
|
FUZ_CHECKTEST(crcCheck!=crcOrig, "LZ4_decompress_safe_usingDict corrupted decoded data");
|
||||||
|
|
||||||
|
FUZ_DISPLAYTEST;
|
||||||
|
decodedBuffer[blockSize-1] = 0;
|
||||||
|
ret = LZ4_decompress_fast_usingDict(compressedBuffer, decodedBuffer, blockSize-1, dict, dictSize);
|
||||||
|
FUZ_CHECKTEST(ret>=0, "LZ4_decompress_fast_usingDict should have failed : wrong original size (-1 byte)");
|
||||||
|
FUZ_CHECKTEST(decodedBuffer[blockSize-1], "LZ4_decompress_fast_usingDict overrun specified output buffer size");
|
||||||
|
|
||||||
|
FUZ_DISPLAYTEST;
|
||||||
|
decodedBuffer[blockSize-1] = 0;
|
||||||
|
ret = LZ4_decompress_safe_usingDict(compressedBuffer, decodedBuffer, blockContinueCompressedSize, blockSize-1, dict, dictSize);
|
||||||
|
FUZ_CHECKTEST(ret>=0, "LZ4_decompress_safe_usingDict should have failed : not enough output size (-1 byte)");
|
||||||
|
FUZ_CHECKTEST(decodedBuffer[blockSize-1], "LZ4_decompress_safe_usingDict overrun specified output buffer size");
|
||||||
|
|
||||||
|
FUZ_DISPLAYTEST;
|
||||||
|
{ U32 const missingBytes = (FUZ_rand(&randState) & 0xF) + 2;
|
||||||
|
if ((U32)blockSize > missingBytes) {
|
||||||
|
decodedBuffer[blockSize-missingBytes] = 0;
|
||||||
|
ret = LZ4_decompress_safe_usingDict(compressedBuffer, decodedBuffer, blockContinueCompressedSize, blockSize-missingBytes, dict, dictSize);
|
||||||
|
FUZ_CHECKTEST(ret>=0, "LZ4_decompress_safe_usingDict should have failed : output buffer too small (-%u byte)", missingBytes);
|
||||||
|
FUZ_CHECKTEST(decodedBuffer[blockSize-missingBytes], "LZ4_decompress_safe_usingDict overrun specified output buffer size (-%u byte) (blockSize=%i)", missingBytes, blockSize);
|
||||||
|
} }
|
||||||
|
|
||||||
/* Compress HC using External dictionary */
|
/* Compress HC using External dictionary */
|
||||||
FUZ_DISPLAYTEST;
|
FUZ_DISPLAYTEST;
|
||||||
dict -= (FUZ_rand(&randState) & 7); /* even bigger separation */
|
dict -= (FUZ_rand(&randState) & 7); /* even bigger separation */
|
||||||
|
Loading…
Reference in New Issue
Block a user