initial commit
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
# THIS BENCHMARK IS BEING REPLACED BY automated-bencmarking.py
|
||||
|
||||
# ################################################################
|
||||
# Copyright (c) Przemyslaw Skibinski, Yann Collet, Facebook, Inc.
|
||||
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
+3
-3
@@ -1,6 +1,6 @@
|
||||
|
||||
# ################################################################
|
||||
# Copyright (c) Yann Collet, Facebook, Inc.
|
||||
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -169,7 +169,7 @@ fuzzer-dll : $(ZSTDDIR)/common/xxhash.c $(PRGDIR)/util.c $(PRGDIR)/timefn.c $(PR
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(filter %.c,$^) $(LDFLAGS) -o $@$(EXT)
|
||||
|
||||
CLEAN += zstreamtest zstreamtest32
|
||||
ZSTREAM_LOCAL_FILES := $(PRGDIR)/datagen.c $(PRGDIR)/util.c $(PRGDIR)/timefn.c seqgen.c zstreamtest.c
|
||||
ZSTREAM_LOCAL_FILES := $(PRGDIR)/datagen.c $(PRGDIR)/util.c $(PRGDIR)/timefn.c seqgen.c zstreamtest.c external_matchfinder.c
|
||||
ZSTREAM_PROPER_FILES := $(ZDICT_FILES) $(ZSTREAM_LOCAL_FILES)
|
||||
ZSTREAMFILES := $(ZSTD_FILES) $(ZSTREAM_PROPER_FILES)
|
||||
zstreamtest32 : CFLAGS += -m32
|
||||
@@ -373,7 +373,7 @@ test-zstream: zstreamtest
|
||||
$(QEMU_SYS) ./zstreamtest --newapi -t1 $(ZSTREAM_TESTTIME) $(FUZZER_FLAGS)
|
||||
|
||||
test-zstream32: zstreamtest32
|
||||
$(QEMU_SYS) ./zstreamtest32 $(ZSTREAM_TESTTIME) $(FUZZER_FLAGS)
|
||||
$(QEMU_SYS) ./zstreamtest32 -v $(ZSTREAM_TESTTIME) $(FUZZER_FLAGS)
|
||||
|
||||
test-longmatch: longmatch
|
||||
$(QEMU_SYS) ./longmatch
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# ################################################################
|
||||
# Copyright (c) Facebook, Inc.
|
||||
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
Executable
+31
@@ -0,0 +1,31 @@
|
||||
#!/usr/bin/env python3
|
||||
# ################################################################
|
||||
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This source code is licensed under both the BSD-style license (found in the
|
||||
# LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
||||
# in the COPYING file in the root directory of this source tree).
|
||||
# You may select, at your option, one of the above-listed licenses.
|
||||
# ################################################################
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
if len(sys.argv) != 3:
|
||||
print(f"Usage: {sys.argv[0]} FILE SIZE_LIMIT")
|
||||
sys.exit(1)
|
||||
|
||||
file = sys.argv[1]
|
||||
limit = int(sys.argv[2])
|
||||
|
||||
if not os.path.exists(file):
|
||||
print(f"{file} does not exist")
|
||||
sys.exit(1)
|
||||
|
||||
size = os.path.getsize(file)
|
||||
|
||||
if size > limit:
|
||||
print(f"file {file} is {size} bytes, which is greater than the limit of {limit} bytes")
|
||||
sys.exit(1)
|
||||
@@ -45,6 +45,16 @@ Examples:
|
||||
./run.py --preserve --verbose basic/help.sh
|
||||
```
|
||||
|
||||
### Updating exact output
|
||||
|
||||
If a test is failing because a `.stderr.exact` or `.stdout.exact` no longer matches, you can re-run the tests with `--set-exact-output` and the correct output will be written.
|
||||
|
||||
Example:
|
||||
```
|
||||
./run.py --set-exact-output
|
||||
./run.py basic/help.sh --set-exact-output
|
||||
```
|
||||
|
||||
## Writing a test
|
||||
|
||||
Test cases are arbitrary executables, and can be written in any language, but are generally shell scripts.
|
||||
|
||||
@@ -1,25 +1,34 @@
|
||||
+ zstd -h
|
||||
Usage: zstd *OPTION*... *FILE*... *-o file*
|
||||
Compress or uncompress FILEs (with no FILE or when FILE is `-`, read from standard input).
|
||||
Compress or decompress the INPUT file(s); reads from STDIN if INPUT is `-` or not provided.
|
||||
|
||||
-o file result stored into `file` (only 1 output file)
|
||||
-1 .. -19 compression level (faster .. better; default: 3)
|
||||
-d, --decompress decompression
|
||||
-f, --force disable input and output checks. Allows overwriting existing files,
|
||||
input from console, output to stdout, operating on links,
|
||||
block devices, etc. During decompression and when the output
|
||||
destination is stdout, pass-through unrecognized formats as-is.
|
||||
--rm remove source file(s) after successful de/compression
|
||||
-k, --keep preserve source file(s) (default)
|
||||
-D DICT use DICT as Dictionary for compression or decompression
|
||||
-h display usage and exit
|
||||
-H,--help display long help and exit
|
||||
Usage: zstd *OPTIONS...* *INPUT... | -* *-o OUTPUT*
|
||||
|
||||
Options:
|
||||
-o OUTPUT Write output to a single file, OUTPUT.
|
||||
-k, --keep Preserve INPUT file(s). *Default*
|
||||
--rm Remove INPUT file(s) after successful (de)compression.
|
||||
|
||||
-# Desired compression level, where `#` is a number between 1 and 19;
|
||||
lower numbers provide faster compression, higher numbers yield
|
||||
better compression ratios. *Default: 3*
|
||||
|
||||
-d, --decompress Perform decompression.
|
||||
-D DICT Use DICT as the dictionary for compression or decompression.
|
||||
|
||||
-f, --force Disable input and output checks. Allows overwriting existing files,
|
||||
receiving input from the console, printing ouput to STDOUT, and
|
||||
operating on links, block devices, etc. Unrecognized formats will be
|
||||
passed-through through as-is.
|
||||
|
||||
-h Display short usage and exit.
|
||||
-H, --help Display full help and exit.
|
||||
-V, --version Display the program version and exit.
|
||||
|
||||
+ zstd -H
|
||||
...
|
||||
Advanced options :
|
||||
Advanced options:
|
||||
...
|
||||
+ zstd --help
|
||||
...
|
||||
Advanced options :
|
||||
Advanced options:
|
||||
...
|
||||
|
||||
@@ -15,25 +15,25 @@ zstd --memory=32asbdf file && die "Should not allow bogus suffix"
|
||||
println "+ zstd --memory=hello file"
|
||||
zstd --memory=hello file && die "Should not allow non-numeric parameter"
|
||||
println "+ zstd --memory=1 file"
|
||||
zstd --memory=1 file && die "Should allow numeric parameter without suffix"
|
||||
zstd -q --memory=1 file && die "Should allow numeric parameter without suffix"
|
||||
rm file.zst
|
||||
println "+ zstd --memory=1K file"
|
||||
zstd --memory=1K file && die "Should allow numeric parameter with expected suffix"
|
||||
zstd -q --memory=1K file && die "Should allow numeric parameter with expected suffix"
|
||||
rm file.zst
|
||||
println "+ zstd --memory=1KB file"
|
||||
zstd --memory=1KB file && die "Should allow numeric parameter with expected suffix"
|
||||
zstd -q --memory=1KB file && die "Should allow numeric parameter with expected suffix"
|
||||
rm file.zst
|
||||
println "+ zstd --memory=1KiB file"
|
||||
zstd --memory=1KiB file && die "Should allow numeric parameter with expected suffix"
|
||||
zstd -q --memory=1KiB file && die "Should allow numeric parameter with expected suffix"
|
||||
rm file.zst
|
||||
println "+ zstd --memory=1M file"
|
||||
zstd --memory=1M file && die "Should allow numeric parameter with expected suffix"
|
||||
zstd -q --memory=1M file && die "Should allow numeric parameter with expected suffix"
|
||||
rm file.zst
|
||||
println "+ zstd --memory=1MB file"
|
||||
zstd --memory=1MB file && die "Should allow numeric parameter with expected suffix"
|
||||
zstd -q --memory=1MB file && die "Should allow numeric parameter with expected suffix"
|
||||
rm file.zst
|
||||
println "+ zstd --memory=1MiB file"
|
||||
zstd --memory=1MiB file && die "Should allow numeric parameter with expected suffix"
|
||||
zstd -q --memory=1MiB file && die "Should allow numeric parameter with expected suffix"
|
||||
rm file.zst
|
||||
|
||||
rm file
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
*** zstd command line interface *-bits v1.*.*, by Yann Collet ***
|
||||
*** zstd command line interface *-bits v1.*.*, by Yann Collet ***
|
||||
*** Zstandard CLI (*-bit) v1.*.*, by Yann Collet ***
|
||||
*** Zstandard CLI (*-bit) v1.*.*, by Yann Collet ***
|
||||
|
||||
@@ -4,3 +4,11 @@ set -e
|
||||
|
||||
# Test --adapt
|
||||
zstd -f file --adapt -c | zstd -t
|
||||
|
||||
datagen -g100M > file100M
|
||||
|
||||
# Pick parameters to force fast adaptation, even on slow systems
|
||||
zstd --adapt -vvvv -19 --zstd=wlog=10 file100M -o /dev/null 2>&1 | grep -q "faster speed , lighter compression"
|
||||
|
||||
# Adaption still happens with --no-progress
|
||||
zstd --no-progress --adapt -vvvv -19 --zstd=wlog=10 file100M -o /dev/null 2>&1 | grep -q "faster speed , lighter compression"
|
||||
|
||||
@@ -6,29 +6,27 @@ set -v
|
||||
datagen > file
|
||||
|
||||
# Compress with various levels and ensure that their sizes are ordered
|
||||
zstd --fast=10 file -o file-f10.zst
|
||||
zstd --fast=1 file -o file-f1.zst
|
||||
zstd -1 file -o file-1.zst
|
||||
zstd -19 file -o file-19.zst
|
||||
zstd -22 --ultra file -o file-22.zst
|
||||
zstd --fast=10 file -o file-f10.zst -q
|
||||
zstd --fast=1 file -o file-f1.zst -q
|
||||
zstd -1 file -o file-1.zst -q
|
||||
zstd -19 file -o file-19.zst -q
|
||||
|
||||
zstd -t file-f10.zst file-f1.zst file-1.zst file-19.zst file-22.zst
|
||||
zstd -t file-f10.zst file-f1.zst file-1.zst file-19.zst
|
||||
|
||||
cmp_size -ne file-19.zst file-22.zst
|
||||
cmp_size -lt file-19.zst file-1.zst
|
||||
cmp_size -lt file-1.zst file-f1.zst
|
||||
cmp_size -lt file-f1.zst file-f10.zst
|
||||
|
||||
# Test default levels
|
||||
zstd --fast file -f
|
||||
zstd --fast file -f -q
|
||||
cmp file.zst file-f1.zst || die "--fast is not level -1"
|
||||
|
||||
zstd -0 file -o file-0.zst
|
||||
zstd -f file
|
||||
zstd -0 file -o file-0.zst -q
|
||||
zstd -f file -q
|
||||
cmp file.zst file-0.zst || die "Level 0 is not the default level"
|
||||
|
||||
# Test level clamping
|
||||
zstd -99 file -o file-99.zst
|
||||
zstd -99 file -o file-99.zst -q
|
||||
cmp file-19.zst file-99.zst || die "Level 99 is clamped to 19"
|
||||
zstd --fast=200000 file -c | zstd -t
|
||||
|
||||
@@ -36,10 +34,10 @@ zstd -5000000000 -f file && die "Level too large, must fail" ||:
|
||||
zstd --fast=5000000000 -f file && die "Level too large, must fail" ||:
|
||||
|
||||
# Test setting a level through the environment variable
|
||||
ZSTD_CLEVEL=-10 zstd file -o file-f10-env.zst
|
||||
ZSTD_CLEVEL=1 zstd file -o file-1-env.zst
|
||||
ZSTD_CLEVEL=+19 zstd file -o file-19-env.zst
|
||||
ZSTD_CLEVEL=+99 zstd file -o file-99-env.zst
|
||||
ZSTD_CLEVEL=-10 zstd file -o file-f10-env.zst -q
|
||||
ZSTD_CLEVEL=1 zstd file -o file-1-env.zst -q
|
||||
ZSTD_CLEVEL=+19 zstd file -o file-19-env.zst -q
|
||||
ZSTD_CLEVEL=+99 zstd file -o file-99-env.zst -q
|
||||
|
||||
cmp file-f10.zst file-f10-env.zst || die "Environment variable failed to set level"
|
||||
cmp file-1.zst file-1-env.zst || die "Environment variable failed to set level"
|
||||
@@ -47,18 +45,18 @@ cmp file-19.zst file-19-env.zst || die "Environment variable failed to set level
|
||||
cmp file-99.zst file-99-env.zst || die "Environment variable failed to set level"
|
||||
|
||||
# Test invalid environment clevel is the default level
|
||||
zstd -f file
|
||||
ZSTD_CLEVEL=- zstd -f file -o file-env.zst ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=+ zstd -f file -o file-env.zst ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=a zstd -f file -o file-env.zst ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=-a zstd -f file -o file-env.zst ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=+a zstd -f file -o file-env.zst ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=3a7 zstd -f file -o file-env.zst ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=5000000000 zstd -f file -o file-env.zst; cmp file.zst file-env.zst
|
||||
zstd -f file -q
|
||||
ZSTD_CLEVEL=- zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=+ zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=a zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=-a zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=+a zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=3a7 zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=5000000000 zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
|
||||
# Test environment clevel is overridden by command line
|
||||
ZSTD_CLEVEL=10 zstd -f file -1 -o file-1-env.zst
|
||||
ZSTD_CLEVEL=10 zstd -f file --fast=1 -o file-f1-env.zst
|
||||
ZSTD_CLEVEL=10 zstd -f file -1 -o file-1-env.zst -q
|
||||
ZSTD_CLEVEL=10 zstd -f file --fast=1 -o file-f1-env.zst -q
|
||||
|
||||
cmp file-1.zst file-1-env.zst || die "Environment variable not overridden"
|
||||
cmp file-f1.zst file-f1-env.zst || die "Environment variable not overridden"
|
||||
|
||||
@@ -2,32 +2,31 @@
|
||||
datagen > file
|
||||
|
||||
# Compress with various levels and ensure that their sizes are ordered
|
||||
zstd --fast=10 file -o file-f10.zst
|
||||
zstd --fast=1 file -o file-f1.zst
|
||||
zstd -1 file -o file-1.zst
|
||||
zstd -19 file -o file-19.zst
|
||||
zstd -22 --ultra file -o file-22.zst
|
||||
zstd --fast=10 file -o file-f10.zst -q
|
||||
zstd --fast=1 file -o file-f1.zst -q
|
||||
zstd -1 file -o file-1.zst -q
|
||||
zstd -19 file -o file-19.zst -q
|
||||
|
||||
zstd -t file-f10.zst file-f1.zst file-1.zst file-19.zst file-22.zst
|
||||
zstd -t file-f10.zst file-f1.zst file-1.zst file-19.zst
|
||||
4 files decompressed : 262148 bytes total
|
||||
|
||||
cmp_size -ne file-19.zst file-22.zst
|
||||
cmp_size -lt file-19.zst file-1.zst
|
||||
cmp_size -lt file-1.zst file-f1.zst
|
||||
cmp_size -lt file-f1.zst file-f10.zst
|
||||
|
||||
# Test default levels
|
||||
zstd --fast file -f
|
||||
zstd --fast file -f -q
|
||||
cmp file.zst file-f1.zst || die "--fast is not level -1"
|
||||
|
||||
zstd -0 file -o file-0.zst
|
||||
zstd -f file
|
||||
zstd -0 file -o file-0.zst -q
|
||||
zstd -f file -q
|
||||
cmp file.zst file-0.zst || die "Level 0 is not the default level"
|
||||
|
||||
# Test level clamping
|
||||
zstd -99 file -o file-99.zst
|
||||
Warning : compression level higher than max, reduced to 19
|
||||
zstd -99 file -o file-99.zst -q
|
||||
cmp file-19.zst file-99.zst || die "Level 99 is clamped to 19"
|
||||
zstd --fast=200000 file -c | zstd -t
|
||||
/*stdin*\ : 65537 bytes
|
||||
|
||||
zstd -5000000000 -f file && die "Level too large, must fail" ||:
|
||||
error: numeric value overflows 32-bit unsigned int
|
||||
@@ -35,11 +34,10 @@ zstd --fast=5000000000 -f file && die "Level too large, must fail" ||:
|
||||
error: numeric value overflows 32-bit unsigned int
|
||||
|
||||
# Test setting a level through the environment variable
|
||||
ZSTD_CLEVEL=-10 zstd file -o file-f10-env.zst
|
||||
ZSTD_CLEVEL=1 zstd file -o file-1-env.zst
|
||||
ZSTD_CLEVEL=+19 zstd file -o file-19-env.zst
|
||||
ZSTD_CLEVEL=+99 zstd file -o file-99-env.zst
|
||||
Warning : compression level higher than max, reduced to 19
|
||||
ZSTD_CLEVEL=-10 zstd file -o file-f10-env.zst -q
|
||||
ZSTD_CLEVEL=1 zstd file -o file-1-env.zst -q
|
||||
ZSTD_CLEVEL=+19 zstd file -o file-19-env.zst -q
|
||||
ZSTD_CLEVEL=+99 zstd file -o file-99-env.zst -q
|
||||
|
||||
cmp file-f10.zst file-f10-env.zst || die "Environment variable failed to set level"
|
||||
cmp file-1.zst file-1-env.zst || die "Environment variable failed to set level"
|
||||
@@ -47,25 +45,25 @@ cmp file-19.zst file-19-env.zst || die "Environment variable failed to set level
|
||||
cmp file-99.zst file-99-env.zst || die "Environment variable failed to set level"
|
||||
|
||||
# Test invalid environment clevel is the default level
|
||||
zstd -f file
|
||||
ZSTD_CLEVEL=- zstd -f file -o file-env.zst ; cmp file.zst file-env.zst
|
||||
zstd -f file -q
|
||||
ZSTD_CLEVEL=- zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
Ignore environment variable setting ZSTD_CLEVEL=-: not a valid integer value
|
||||
ZSTD_CLEVEL=+ zstd -f file -o file-env.zst ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=+ zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
Ignore environment variable setting ZSTD_CLEVEL=+: not a valid integer value
|
||||
ZSTD_CLEVEL=a zstd -f file -o file-env.zst ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=a zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
Ignore environment variable setting ZSTD_CLEVEL=a: not a valid integer value
|
||||
ZSTD_CLEVEL=-a zstd -f file -o file-env.zst ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=-a zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
Ignore environment variable setting ZSTD_CLEVEL=-a: not a valid integer value
|
||||
ZSTD_CLEVEL=+a zstd -f file -o file-env.zst ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=+a zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
Ignore environment variable setting ZSTD_CLEVEL=+a: not a valid integer value
|
||||
ZSTD_CLEVEL=3a7 zstd -f file -o file-env.zst ; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=3a7 zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
Ignore environment variable setting ZSTD_CLEVEL=3a7: not a valid integer value
|
||||
ZSTD_CLEVEL=5000000000 zstd -f file -o file-env.zst; cmp file.zst file-env.zst
|
||||
ZSTD_CLEVEL=5000000000 zstd -f file -o file-env.zst -q ; cmp file.zst file-env.zst
|
||||
Ignore environment variable setting ZSTD_CLEVEL=5000000000: numeric value too large
|
||||
|
||||
# Test environment clevel is overridden by command line
|
||||
ZSTD_CLEVEL=10 zstd -f file -1 -o file-1-env.zst
|
||||
ZSTD_CLEVEL=10 zstd -f file --fast=1 -o file-f1-env.zst
|
||||
ZSTD_CLEVEL=10 zstd -f file -1 -o file-1-env.zst -q
|
||||
ZSTD_CLEVEL=10 zstd -f file --fast=1 -o file-f1-env.zst -q
|
||||
|
||||
cmp file-1.zst file-1-env.zst || die "Environment variable not overridden"
|
||||
cmp file-f1.zst file-f1-env.zst || die "Environment variable not overridden"
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
set -e
|
||||
|
||||
# Test multi-threaded flags
|
||||
zstd --single-thread file -f ; zstd -t file.zst
|
||||
zstd -T2 -f file ; zstd -t file.zst
|
||||
zstd --rsyncable -f file ; zstd -t file.zst
|
||||
zstd -T0 -f file ; zstd -t file.zst
|
||||
zstd -T0 --auto-threads=logical -f file ; zstd -t file.zst
|
||||
zstd -T0 --auto-threads=physical -f file; zstd -t file.zst
|
||||
zstd --single-thread file -f -q ; zstd -t file.zst
|
||||
zstd -T2 -f file -q ; zstd -t file.zst
|
||||
zstd --rsyncable -f file -q ; zstd -t file.zst
|
||||
zstd -T0 -f file -q ; zstd -t file.zst
|
||||
zstd -T0 --auto-threads=logical -f file -q ; zstd -t file.zst
|
||||
zstd -T0 --auto-threads=physical -f file -q ; zstd -t file.zst
|
||||
|
||||
# multi-thread decompression warning test
|
||||
zstd -T0 -f file ; zstd -t file.zst; zstd -T0 -d file.zst -o file3
|
||||
zstd -T0 -f file ; zstd -t file.zst; zstd -T2 -d file.zst -o file4
|
||||
zstd -T0 -f file -q ; zstd -t file.zst; zstd -T0 -d file.zst -o file3
|
||||
zstd -T0 -f file -q ; zstd -t file.zst; zstd -T2 -d file.zst -o file4
|
||||
|
||||
@@ -1 +1,11 @@
|
||||
file.zst : 65537 bytes
|
||||
file.zst : 65537 bytes
|
||||
file.zst : 65537 bytes
|
||||
file.zst : 65537 bytes
|
||||
file.zst : 65537 bytes
|
||||
file.zst : 65537 bytes
|
||||
file.zst : 65537 bytes
|
||||
file.zst : 65537 bytes
|
||||
file.zst : 65537 bytes
|
||||
Warning : decompression does not support multi-threading
|
||||
file.zst : 65537 bytes
|
||||
|
||||
Executable
+9
@@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
datagen -g1G > file
|
||||
zstd --long=31 -1 --single-thread --no-content-size -f file
|
||||
zstd -l -v file.zst
|
||||
|
||||
# We want to ignore stderr (its outputting "*** zstd command line interface
|
||||
# 64-bits v1.5.3, by Yann Collet ***")
|
||||
|
||||
rm file file.zst
|
||||
@@ -0,0 +1,3 @@
|
||||
...
|
||||
Window Size: 1.000 GiB (1073741824 B)
|
||||
...
|
||||
@@ -1,3 +1,4 @@
|
||||
file :230.00% ( 10 B => 23 B, file.zst)
|
||||
zstd: file: unsupported format
|
||||
zstd: file: unsupported format
|
||||
zstd: file: unsupported format
|
||||
|
||||
@@ -23,7 +23,7 @@ if [ false ]; then
|
||||
fi
|
||||
|
||||
set -v
|
||||
zstd files/0 -D dicts/0
|
||||
zstd files/0 -D dicts/0 -q
|
||||
zstd -t files/0.zst -D dicts/0
|
||||
zstd -t files/0.zst -D dicts/1 && die "Must fail" ||:
|
||||
zstd -t files/0.zst && die "Must fail" ||:
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
zstd files/0 -D dicts/0
|
||||
zstd files/0 -D dicts/0 -q
|
||||
zstd -t files/0.zst -D dicts/0
|
||||
files/0.zst : 1000 bytes
|
||||
zstd -t files/0.zst -D dicts/1 && die "Must fail" ||:
|
||||
files/0.zst : Decoding error (36) : Dictionary mismatch
|
||||
zstd -t files/0.zst && die "Must fail" ||:
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
datagen > file
|
||||
chmod 642 file
|
||||
|
||||
zstd file -q --trace-file-stat -o file.zst
|
||||
zstd -tq file.zst
|
||||
@@ -0,0 +1,42 @@
|
||||
Trace:FileStat: > UTIL_isLink(file)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isConsole(2)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_getFileSize(file)
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: < 65537
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_isDirectoryStat()
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_isSameFile(file, file.zst)
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_stat(file.zst)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isRegularFile(file.zst)
|
||||
Trace:FileStat: > UTIL_stat(file.zst)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isRegularFile(file.zst)
|
||||
Trace:FileStat: > UTIL_stat(file.zst)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_getFileSize(file)
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: < 65537
|
||||
Trace:FileStat: > UTIL_setFileStat(file.zst)
|
||||
Trace:FileStat: > UTIL_stat(file.zst)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_utime(file.zst)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_chmod(file.zst, 0642)
|
||||
Trace:FileStat: > chmod
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
datagen > file
|
||||
|
||||
zstd file -cq --trace-file-stat > file.zst
|
||||
zstd -tq file.zst
|
||||
@@ -0,0 +1,24 @@
|
||||
Trace:FileStat: > UTIL_isLink(file)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isConsole(1)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isConsole(2)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_getFileSize(file)
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: < 65537
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_isDirectoryStat()
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_isRegularFile(/*stdout*\)
|
||||
Trace:FileStat: > UTIL_stat(/*stdout*\)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_getFileSize(file)
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: < 65537
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
datagen > file
|
||||
|
||||
zstd < file -q --trace-file-stat -o file.zst
|
||||
zstd -tq file.zst
|
||||
@@ -0,0 +1,24 @@
|
||||
Trace:FileStat: > UTIL_isConsole(0)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isConsole(2)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_getFileSize(/*stdin*\)
|
||||
Trace:FileStat: > UTIL_stat(/*stdin*\)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < -1
|
||||
Trace:FileStat: > UTIL_isSameFile(/*stdin*\, file.zst)
|
||||
Trace:FileStat: > UTIL_stat(/*stdin*\)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isRegularFile(file.zst)
|
||||
Trace:FileStat: > UTIL_stat(file.zst)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isRegularFile(file.zst)
|
||||
Trace:FileStat: > UTIL_stat(file.zst)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_getFileSize(/*stdin*\)
|
||||
Trace:FileStat: > UTIL_stat(/*stdin*\)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < -1
|
||||
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
datagen > file
|
||||
|
||||
zstd < file -cq --trace-file-stat > file.zst
|
||||
zstd -tq file.zst
|
||||
@@ -0,0 +1,18 @@
|
||||
Trace:FileStat: > UTIL_isConsole(0)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isConsole(1)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isConsole(2)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_getFileSize(/*stdin*\)
|
||||
Trace:FileStat: > UTIL_stat(/*stdin*\)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < -1
|
||||
Trace:FileStat: > UTIL_isRegularFile(/*stdout*\)
|
||||
Trace:FileStat: > UTIL_stat(/*stdout*\)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_getFileSize(/*stdin*\)
|
||||
Trace:FileStat: > UTIL_stat(/*stdin*\)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < -1
|
||||
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
datagen | zstd -q > file.zst
|
||||
chmod 642 file.zst
|
||||
|
||||
zstd -dq --trace-file-stat file.zst
|
||||
@@ -0,0 +1,38 @@
|
||||
Trace:FileStat: > UTIL_isLink(file.zst)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isConsole(1)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isConsole(2)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isDirectory(file.zst)
|
||||
Trace:FileStat: > UTIL_stat(file.zst)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_isDirectoryStat()
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_stat(file.zst)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_isSameFile(file.zst, file)
|
||||
Trace:FileStat: > UTIL_stat(file.zst)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isRegularFile(file)
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isRegularFile(file)
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_setFileStat(file)
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_utime(file)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_chmod(file, 0642)
|
||||
Trace:FileStat: > chmod
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
@@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
datagen | zstd -q > file.zst
|
||||
|
||||
zstd -dcq --trace-file-stat file.zst > file
|
||||
@@ -0,0 +1,18 @@
|
||||
Trace:FileStat: > UTIL_isLink(file.zst)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isConsole(1)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isConsole(2)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isDirectory(file.zst)
|
||||
Trace:FileStat: > UTIL_stat(file.zst)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_isDirectoryStat()
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_stat(file.zst)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: > UTIL_isRegularFile(/*stdout*\)
|
||||
Trace:FileStat: > UTIL_stat(/*stdout*\)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
@@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
datagen | zstd -q > file.zst
|
||||
|
||||
zstd -dcq --trace-file-stat < file.zst -o file
|
||||
@@ -0,0 +1,20 @@
|
||||
Trace:FileStat: > UTIL_isConsole(0)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isConsole(2)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isDirectory(/*stdin*\)
|
||||
Trace:FileStat: > UTIL_stat(/*stdin*\)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isSameFile(/*stdin*\, file)
|
||||
Trace:FileStat: > UTIL_stat(/*stdin*\)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isRegularFile(file)
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isRegularFile(file)
|
||||
Trace:FileStat: > UTIL_stat(file)
|
||||
Trace:FileStat: < 1
|
||||
Trace:FileStat: < 1
|
||||
@@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
datagen | zstd -q > file.zst
|
||||
|
||||
zstd -dcq --trace-file-stat < file.zst > file
|
||||
@@ -0,0 +1,14 @@
|
||||
Trace:FileStat: > UTIL_isConsole(0)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isConsole(1)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isConsole(2)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isDirectory(/*stdin*\)
|
||||
Trace:FileStat: > UTIL_stat(/*stdin*\)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: > UTIL_isRegularFile(/*stdout*\)
|
||||
Trace:FileStat: > UTIL_stat(/*stdout*\)
|
||||
Trace:FileStat: < 0
|
||||
Trace:FileStat: < 0
|
||||
Executable
+46
@@ -0,0 +1,46 @@
|
||||
#!/bin/sh
|
||||
|
||||
#!/bin/sh
|
||||
|
||||
. "$COMMON/platform.sh"
|
||||
|
||||
set -e
|
||||
|
||||
echo hello > hello
|
||||
echo world > world
|
||||
|
||||
zstd -q hello world
|
||||
|
||||
println >&2 "Tests cases where progress information should not be printed"
|
||||
|
||||
for args in \
|
||||
"" \
|
||||
"--fake-stderr-is-console -q" \
|
||||
"--fake-stderr-is-console -qq --progress" \
|
||||
"--no-progress --fake-stderr-is-console" \
|
||||
"--no-progress --fake-stderr-is-console -v"
|
||||
do
|
||||
println >&2 "args = $args"
|
||||
println >&2 "compress file to file"
|
||||
zstd $args -f hello
|
||||
println >&2 "compress pipe to pipe"
|
||||
zstd $args < hello > $INTOVOID
|
||||
println >&2 "compress pipe to file"
|
||||
zstd $args < hello -fo hello.zst
|
||||
println >&2 "compress file to pipe"
|
||||
zstd $args hello -c > $INTOVOID
|
||||
println >&2 "compress 2 files"
|
||||
zstd $args -f hello world
|
||||
|
||||
println >&2 "decompress file to file"
|
||||
zstd $args -d -f hello.zst
|
||||
println >&2 "decompress pipe to pipe"
|
||||
zstd $args -d < hello.zst > $INTOVOID
|
||||
println >&2 "decompress pipe to file"
|
||||
zstd $args -d < hello.zst -fo hello
|
||||
println >&2 "decompress file to pipe"
|
||||
zstd $args -d hello.zst -c > $INTOVOID
|
||||
println >&2 "decompress 2 files"
|
||||
zstd $args -d -f hello.zst world.zst
|
||||
println >&2 ""
|
||||
done
|
||||
@@ -0,0 +1,96 @@
|
||||
Tests cases where progress information should not be printed
|
||||
args =
|
||||
compress file to file
|
||||
hello*hello.zst*
|
||||
compress pipe to pipe
|
||||
compress pipe to file
|
||||
*stdin*hello.zst*
|
||||
compress file to pipe
|
||||
compress 2 files
|
||||
2 files compressed*
|
||||
decompress file to file
|
||||
hello.zst*
|
||||
decompress pipe to pipe
|
||||
decompress pipe to file
|
||||
*stdin*
|
||||
decompress file to pipe
|
||||
decompress 2 files
|
||||
2 files decompressed*
|
||||
|
||||
args = --fake-stderr-is-console -q
|
||||
compress file to file
|
||||
compress pipe to pipe
|
||||
compress pipe to file
|
||||
compress file to pipe
|
||||
compress 2 files
|
||||
decompress file to file
|
||||
decompress pipe to pipe
|
||||
decompress pipe to file
|
||||
decompress file to pipe
|
||||
decompress 2 files
|
||||
|
||||
args = --fake-stderr-is-console -qq --progress
|
||||
compress file to file
|
||||
compress pipe to pipe
|
||||
compress pipe to file
|
||||
compress file to pipe
|
||||
compress 2 files
|
||||
decompress file to file
|
||||
decompress pipe to pipe
|
||||
decompress pipe to file
|
||||
decompress file to pipe
|
||||
decompress 2 files
|
||||
|
||||
args = --no-progress --fake-stderr-is-console
|
||||
compress file to file
|
||||
hello*hello.zst*
|
||||
compress pipe to pipe
|
||||
compress pipe to file
|
||||
*stdin*hello.zst*
|
||||
compress file to pipe
|
||||
compress 2 files
|
||||
2 files compressed*
|
||||
decompress file to file
|
||||
hello.zst*
|
||||
decompress pipe to pipe
|
||||
decompress pipe to file
|
||||
*stdin*
|
||||
decompress file to pipe
|
||||
decompress 2 files
|
||||
2 files decompressed*
|
||||
|
||||
args = --no-progress --fake-stderr-is-console -v
|
||||
compress file to file
|
||||
*Zstandard CLI*
|
||||
hello*hello.zst*
|
||||
compress pipe to pipe
|
||||
*Zstandard CLI*
|
||||
*stdin*stdout*
|
||||
compress pipe to file
|
||||
*Zstandard CLI*
|
||||
*stdin*hello.zst*
|
||||
compress file to pipe
|
||||
*Zstandard CLI*
|
||||
*hello*stdout*
|
||||
compress 2 files
|
||||
*Zstandard CLI*
|
||||
*hello*hello.zst*
|
||||
*world*world.zst*
|
||||
2 files compressed*
|
||||
decompress file to file
|
||||
*Zstandard CLI*
|
||||
hello.zst*
|
||||
decompress pipe to pipe
|
||||
*Zstandard CLI*
|
||||
*stdin*
|
||||
decompress pipe to file
|
||||
*Zstandard CLI*
|
||||
*stdin*
|
||||
decompress file to pipe
|
||||
*Zstandard CLI*
|
||||
hello.zst*
|
||||
decompress 2 files
|
||||
*Zstandard CLI*
|
||||
hello.zst*
|
||||
world.zst*
|
||||
2 files decompressed*
|
||||
Executable
+41
@@ -0,0 +1,41 @@
|
||||
#!/bin/sh
|
||||
|
||||
. "$COMMON/platform.sh"
|
||||
|
||||
set -e
|
||||
|
||||
println >&2 "Tests cases where progress information should be printed"
|
||||
|
||||
echo hello > hello
|
||||
echo world > world
|
||||
|
||||
zstd -q hello world
|
||||
|
||||
for args in \
|
||||
"--progress" \
|
||||
"--fake-stderr-is-console" \
|
||||
"--progress --fake-stderr-is-console -q"; do
|
||||
println >&2 "args = $args"
|
||||
println >&2 "compress file to file"
|
||||
zstd $args -f hello
|
||||
println >&2 "compress pipe to pipe"
|
||||
zstd $args < hello > $INTOVOID
|
||||
println >&2 "compress pipe to file"
|
||||
zstd $args < hello -fo hello.zst
|
||||
println >&2 "compress file to pipe"
|
||||
zstd $args hello -c > $INTOVOID
|
||||
println >&2 "compress 2 files"
|
||||
zstd $args -f hello world
|
||||
|
||||
println >&2 "decompress file to file"
|
||||
zstd $args -d -f hello.zst
|
||||
println >&2 "decompress pipe to pipe"
|
||||
zstd $args -d < hello.zst > $INTOVOID
|
||||
println >&2 "decompress pipe to file"
|
||||
zstd $args -d < hello.zst -fo hello
|
||||
println >&2 "decompress file to pipe"
|
||||
zstd $args -d hello.zst -c > $INTOVOID
|
||||
println >&2 "decompress 2 files"
|
||||
zstd $args -d -f hello.zst world.zst
|
||||
println >&2 ""
|
||||
done
|
||||
@@ -0,0 +1,62 @@
|
||||
Tests cases where progress information should be printed
|
||||
args = --progress
|
||||
compress file to file
|
||||
*Read:*hello*hello.zst*
|
||||
compress pipe to pipe
|
||||
*Read:*stdin*stdout*
|
||||
compress pipe to file
|
||||
*Read:*stdin*hello.zst*
|
||||
compress file to pipe
|
||||
*Read:*hello*stdout*
|
||||
compress 2 files
|
||||
*Read*2 files compressed*
|
||||
decompress file to file
|
||||
*hello.zst*hello.zst*
|
||||
decompress pipe to pipe
|
||||
*stdin*stdin*
|
||||
decompress pipe to file
|
||||
*stdin*stdin*
|
||||
decompress file to pipe
|
||||
*hello.zst*hello.zst*
|
||||
decompress 2 files
|
||||
*hello.zst*2 files decompressed*
|
||||
|
||||
args = --fake-stderr-is-console
|
||||
compress file to file
|
||||
*Read:*hello*hello.zst*
|
||||
compress pipe to pipe
|
||||
compress pipe to file
|
||||
*Read:*stdin*hello.zst*
|
||||
compress file to pipe
|
||||
compress 2 files
|
||||
*Read*2 files compressed*
|
||||
decompress file to file
|
||||
*hello.zst*hello.zst*
|
||||
decompress pipe to pipe
|
||||
decompress pipe to file
|
||||
*stdin*stdin*
|
||||
decompress file to pipe
|
||||
decompress 2 files
|
||||
*hello.zst*2 files decompressed*
|
||||
|
||||
args = --progress --fake-stderr-is-console -q
|
||||
compress file to file
|
||||
*Read:*hello*hello.zst*
|
||||
compress pipe to pipe
|
||||
*Read:*stdin*stdout*
|
||||
compress pipe to file
|
||||
*Read:*stdin*hello.zst*
|
||||
compress file to pipe
|
||||
*Read:*hello*stdout*
|
||||
compress 2 files
|
||||
*Read*2 files compressed*
|
||||
decompress file to file
|
||||
*hello.zst*hello.zst*
|
||||
decompress pipe to pipe
|
||||
*stdin*stdin*
|
||||
decompress pipe to file
|
||||
*stdin*stdin*
|
||||
decompress file to pipe
|
||||
*hello.zst*hello.zst*
|
||||
decompress 2 files
|
||||
*hello.zst*2 files decompressed*
|
||||
+16
-7
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env python3
|
||||
# ################################################################
|
||||
# Copyright (c) Facebook, Inc.
|
||||
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -209,6 +209,7 @@ class Options:
|
||||
preserve: bool,
|
||||
scratch_dir: str,
|
||||
test_dir: str,
|
||||
set_exact_output: bool,
|
||||
) -> None:
|
||||
self.env = env
|
||||
self.timeout = timeout
|
||||
@@ -216,6 +217,7 @@ class Options:
|
||||
self.preserve = preserve
|
||||
self.scratch_dir = scratch_dir
|
||||
self.test_dir = test_dir
|
||||
self.set_exact_output = set_exact_output
|
||||
|
||||
|
||||
class TestCase:
|
||||
@@ -335,7 +337,7 @@ class TestCase:
|
||||
self._test_stdin.close()
|
||||
self._test_stdin = None
|
||||
|
||||
def _check_output_exact(self, out_name: str, expected: bytes) -> None:
|
||||
def _check_output_exact(self, out_name: str, expected: bytes, exact_name: str) -> None:
|
||||
"""
|
||||
Check the output named :out_name: for an exact match against the :expected: content.
|
||||
Saves the success and message.
|
||||
@@ -349,6 +351,10 @@ class TestCase:
|
||||
self._success[check_name] = False
|
||||
self._message[check_name] = f"{out_name} does not match!\n> diff expected actual\n{diff(expected, actual)}"
|
||||
|
||||
if self._opts.set_exact_output:
|
||||
with open(exact_name, "wb") as f:
|
||||
f.write(actual)
|
||||
|
||||
def _check_output_glob(self, out_name: str, expected: bytes) -> None:
|
||||
"""
|
||||
Check the output named :out_name: for a glob match against the :expected: glob.
|
||||
@@ -386,15 +392,13 @@ class TestCase:
|
||||
ignore_name = f"{self._test_file}.{out_name}.ignore"
|
||||
|
||||
if os.path.exists(exact_name):
|
||||
return self._check_output_exact(out_name, read_file(exact_name))
|
||||
return self._check_output_exact(out_name, read_file(exact_name), exact_name)
|
||||
elif os.path.exists(glob_name):
|
||||
return self._check_output_glob(out_name, read_file(glob_name))
|
||||
elif os.path.exists(ignore_name):
|
||||
else:
|
||||
check_name = f"check_{out_name}"
|
||||
self._success[check_name] = True
|
||||
self._message[check_name] = f"{out_name} ignored!"
|
||||
else:
|
||||
return self._check_output_exact(out_name, bytes())
|
||||
|
||||
def _check_stderr(self) -> None:
|
||||
"""Checks the stderr output against the expectation."""
|
||||
@@ -678,6 +682,11 @@ if __name__ == "__main__":
|
||||
"Scratch directory located in TEST_DIR/scratch/."
|
||||
)
|
||||
)
|
||||
parser.add_argument(
|
||||
"--set-exact-output",
|
||||
action="store_true",
|
||||
help="Set stderr.exact and stdout.exact for all failing tests, unless .ignore or .glob already exists"
|
||||
)
|
||||
parser.add_argument(
|
||||
"tests",
|
||||
nargs="*",
|
||||
@@ -714,6 +723,7 @@ if __name__ == "__main__":
|
||||
preserve=args.preserve,
|
||||
test_dir=args.test_dir,
|
||||
scratch_dir=scratch_dir,
|
||||
set_exact_output=args.set_exact_output,
|
||||
)
|
||||
|
||||
if len(args.tests) == 0:
|
||||
@@ -726,4 +736,3 @@ if __name__ == "__main__":
|
||||
sys.exit(0)
|
||||
else:
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
+25
-19
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h> /* time(), for seed random initialization */
|
||||
|
||||
#include "util.h"
|
||||
#include "timefn.h" /* UTIL_clockSpanMicro, SEC_TO_MICRO, UTIL_TIME_INITIALIZER */
|
||||
@@ -24,21 +25,13 @@
|
||||
#include "zdict.h"
|
||||
|
||||
/* Direct access to internal compression functions is required */
|
||||
#include "zstd_compress.c"
|
||||
#include "compress/zstd_compress.c" /* ZSTD_resetSeqStore, ZSTD_storeSeq, *_TO_OFFBASE, HIST_countFast_wksp, HIST_isError */
|
||||
|
||||
#define XXH_STATIC_LINKING_ONLY
|
||||
#include "xxhash.h" /* XXH64 */
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef MAX_PATH
|
||||
#ifdef PATH_MAX
|
||||
#define MAX_PATH PATH_MAX
|
||||
#else
|
||||
#define MAX_PATH 256
|
||||
#endif
|
||||
#if !(defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */))
|
||||
# define inline /* disable */
|
||||
#endif
|
||||
|
||||
/*-************************************
|
||||
@@ -70,6 +63,7 @@ static UTIL_time_t g_displayClock = UTIL_TIME_INITIALIZER;
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
/*-*******************************************************
|
||||
* Random function
|
||||
*********************************************************/
|
||||
@@ -136,7 +130,7 @@ static void RAND_genDist(U32* seed, BYTE* dist, double weight)
|
||||
BYTE step = (BYTE) ((RAND(seed) % 256) | 1); /* force it to be odd so it's relatively prime to 256 */
|
||||
|
||||
while (i < DISTSIZE) {
|
||||
size_t states = ((size_t)(weight * statesLeft)) + 1;
|
||||
size_t states = ((size_t)(weight * (double)statesLeft)) + 1;
|
||||
size_t j;
|
||||
for (j = 0; j < states && i < DISTSIZE; j++, i++) {
|
||||
dist[i] = symb;
|
||||
@@ -165,7 +159,7 @@ static double RAND_exp(U32* seed, double mean)
|
||||
/*-*******************************************************
|
||||
* Constants and Structs
|
||||
*********************************************************/
|
||||
const char *BLOCK_TYPES[] = {"raw", "rle", "compressed"};
|
||||
const char* BLOCK_TYPES[] = {"raw", "rle", "compressed"};
|
||||
|
||||
#define MAX_DECOMPRESSED_SIZE_LOG 20
|
||||
#define MAX_DECOMPRESSED_SIZE (1ULL << MAX_DECOMPRESSED_SIZE_LOG)
|
||||
@@ -175,6 +169,14 @@ const char *BLOCK_TYPES[] = {"raw", "rle", "compressed"};
|
||||
#define MIN_SEQ_LEN (3)
|
||||
#define MAX_NB_SEQ ((ZSTD_BLOCKSIZE_MAX + MIN_SEQ_LEN - 1) / MIN_SEQ_LEN)
|
||||
|
||||
#ifndef MAX_PATH
|
||||
#ifdef PATH_MAX
|
||||
#define MAX_PATH PATH_MAX
|
||||
#else
|
||||
#define MAX_PATH 256
|
||||
#endif
|
||||
#endif
|
||||
|
||||
BYTE CONTENT_BUFFER[MAX_DECOMPRESSED_SIZE];
|
||||
BYTE FRAME_BUFFER[MAX_DECOMPRESSED_SIZE * 2];
|
||||
BYTE LITERAL_BUFFER[ZSTD_BLOCKSIZE_MAX];
|
||||
@@ -240,6 +242,10 @@ typedef enum {
|
||||
gt_block, /* generate compressed blocks without block/frame headers */
|
||||
} genType_e;
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
/*-*******************************************************
|
||||
* Global variables (set from command line)
|
||||
*********************************************************/
|
||||
@@ -454,7 +460,7 @@ static size_t writeHufHeader(U32* seed, HUF_CElt* hufTable, void* dst, size_t ds
|
||||
}
|
||||
|
||||
/* Write table description header */
|
||||
{ size_t const hSize = HUF_writeCTable (op, dstSize, hufTable, maxSymbolValue, huffLog);
|
||||
{ size_t const hSize = HUF_writeCTable_wksp (op, dstSize, hufTable, maxSymbolValue, huffLog, WKSP, sizeof(WKSP));
|
||||
if (hSize + 12 >= srcSize) return 0; /* not useful to try compression */
|
||||
op += hSize;
|
||||
}
|
||||
@@ -558,10 +564,10 @@ static size_t writeLiteralsBlockCompressed(U32* seed, frame_t* frame, size_t con
|
||||
sizeFormat == 0
|
||||
? HUF_compress1X_usingCTable(
|
||||
op, opend - op, LITERAL_BUFFER, litSize,
|
||||
frame->stats.hufTable)
|
||||
frame->stats.hufTable, /* flags */ 0)
|
||||
: HUF_compress4X_usingCTable(
|
||||
op, opend - op, LITERAL_BUFFER, litSize,
|
||||
frame->stats.hufTable);
|
||||
frame->stats.hufTable, /* flags */ 0);
|
||||
CHECKERR(compressedSize);
|
||||
/* this only occurs when it could not compress or similar */
|
||||
} while (compressedSize <= 0);
|
||||
@@ -662,11 +668,11 @@ generateSequences(U32* seed, frame_t* frame, seqStore_t* seqStore,
|
||||
* ensure nice numbers */
|
||||
U32 matchLen =
|
||||
MIN_SEQ_LEN +
|
||||
ROUND(RAND_exp(seed, excessMatch / (double)(numSequences - i)));
|
||||
ROUND(RAND_exp(seed, (double)excessMatch / (double)(numSequences - i)));
|
||||
U32 literalLen =
|
||||
(RAND(seed) & 7)
|
||||
? ROUND(RAND_exp(seed,
|
||||
literalsSize /
|
||||
(double)literalsSize /
|
||||
(double)(numSequences - i)))
|
||||
: 0;
|
||||
/* actual offset, code to send, and point to copy up to when shifting
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Meta Platforms, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
||||
* in the COPYING file in the root directory of this source tree).
|
||||
* You may select, at your option, one of the above-listed licenses.
|
||||
*/
|
||||
|
||||
#include "external_matchfinder.h"
|
||||
#include <string.h>
|
||||
#include "zstd_compress_internal.h"
|
||||
|
||||
#define HSIZE 1024
|
||||
static U32 const HLOG = 10;
|
||||
static U32 const MLS = 4;
|
||||
static U32 const BADIDX = 0xffffffff;
|
||||
|
||||
static size_t simpleExternalMatchFinder(
|
||||
void* externalMatchState,
|
||||
ZSTD_Sequence* outSeqs, size_t outSeqsCapacity,
|
||||
const void* src, size_t srcSize,
|
||||
const void* dict, size_t dictSize,
|
||||
int compressionLevel,
|
||||
size_t windowSize
|
||||
) {
|
||||
const BYTE* const istart = (const BYTE*)src;
|
||||
const BYTE* const iend = istart + srcSize;
|
||||
const BYTE* ip = istart;
|
||||
const BYTE* anchor = istart;
|
||||
size_t seqCount = 0;
|
||||
U32 hashTable[HSIZE];
|
||||
|
||||
(void)externalMatchState;
|
||||
(void)dict;
|
||||
(void)dictSize;
|
||||
(void)outSeqsCapacity;
|
||||
(void)compressionLevel;
|
||||
|
||||
{ int i;
|
||||
for (i=0; i < HSIZE; i++) {
|
||||
hashTable[i] = BADIDX;
|
||||
} }
|
||||
|
||||
while (ip + MLS < iend) {
|
||||
size_t const hash = ZSTD_hashPtr(ip, HLOG, MLS);
|
||||
U32 const matchIndex = hashTable[hash];
|
||||
hashTable[hash] = (U32)(ip - istart);
|
||||
|
||||
if (matchIndex != BADIDX) {
|
||||
const BYTE* const match = istart + matchIndex;
|
||||
U32 const matchLen = (U32)ZSTD_count(ip, match, iend);
|
||||
if (matchLen >= ZSTD_MINMATCH_MIN) {
|
||||
U32 const litLen = (U32)(ip - anchor);
|
||||
U32 const offset = (U32)(ip - match);
|
||||
ZSTD_Sequence const seq = {
|
||||
offset, litLen, matchLen, 0
|
||||
};
|
||||
|
||||
/* Note: it's crucial to stay within the window size! */
|
||||
if (offset <= windowSize) {
|
||||
outSeqs[seqCount++] = seq;
|
||||
ip += matchLen;
|
||||
anchor = ip;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ip++;
|
||||
}
|
||||
|
||||
{ ZSTD_Sequence const finalSeq = {
|
||||
0, (U32)(iend - anchor), 0, 0
|
||||
};
|
||||
outSeqs[seqCount++] = finalSeq;
|
||||
}
|
||||
|
||||
return seqCount;
|
||||
}
|
||||
|
||||
size_t zstreamExternalMatchFinder(
|
||||
void* externalMatchState,
|
||||
ZSTD_Sequence* outSeqs, size_t outSeqsCapacity,
|
||||
const void* src, size_t srcSize,
|
||||
const void* dict, size_t dictSize,
|
||||
int compressionLevel,
|
||||
size_t windowSize
|
||||
) {
|
||||
EMF_testCase const testCase = *((EMF_testCase*)externalMatchState);
|
||||
memset(outSeqs, 0, outSeqsCapacity);
|
||||
|
||||
switch (testCase) {
|
||||
case EMF_ZERO_SEQS:
|
||||
return 0;
|
||||
case EMF_ONE_BIG_SEQ:
|
||||
outSeqs[0].offset = 0;
|
||||
outSeqs[0].matchLength = 0;
|
||||
outSeqs[0].litLength = (U32)(srcSize);
|
||||
return 1;
|
||||
case EMF_LOTS_OF_SEQS:
|
||||
return simpleExternalMatchFinder(
|
||||
externalMatchState,
|
||||
outSeqs, outSeqsCapacity,
|
||||
src, srcSize,
|
||||
dict, dictSize,
|
||||
compressionLevel,
|
||||
windowSize
|
||||
);
|
||||
case EMF_INVALID_OFFSET:
|
||||
outSeqs[0].offset = 1 << 20;
|
||||
outSeqs[0].matchLength = 4;
|
||||
outSeqs[0].litLength = (U32)(srcSize - 4);
|
||||
return 1;
|
||||
case EMF_INVALID_MATCHLEN:
|
||||
outSeqs[0].offset = 1;
|
||||
outSeqs[0].matchLength = (U32)(srcSize);
|
||||
outSeqs[0].litLength = 1;
|
||||
return 1;
|
||||
case EMF_INVALID_LITLEN:
|
||||
outSeqs[0].offset = 0;
|
||||
outSeqs[0].matchLength = 0;
|
||||
outSeqs[0].litLength = (U32)(srcSize + 1);
|
||||
return 1;
|
||||
case EMF_INVALID_LAST_LITS:
|
||||
outSeqs[0].offset = 1;
|
||||
outSeqs[0].matchLength = 1;
|
||||
outSeqs[0].litLength = 1;
|
||||
outSeqs[1].offset = 0;
|
||||
outSeqs[1].matchLength = 0;
|
||||
outSeqs[1].litLength = (U32)(srcSize - 1);
|
||||
return 2;
|
||||
case EMF_SMALL_ERROR:
|
||||
return outSeqsCapacity + 1;
|
||||
case EMF_BIG_ERROR:
|
||||
default:
|
||||
return ZSTD_EXTERNAL_MATCHFINDER_ERROR;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Meta Platforms, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
||||
* in the COPYING file in the root directory of this source tree).
|
||||
* You may select, at your option, one of the above-listed licenses.
|
||||
*/
|
||||
|
||||
#ifndef EXTERNAL_MATCHFINDER
|
||||
#define EXTERNAL_MATCHFINDER
|
||||
|
||||
#define ZSTD_STATIC_LINKING_ONLY
|
||||
#include "zstd.h"
|
||||
|
||||
/* See external_matchfinder.c for details on each test case */
|
||||
typedef enum {
|
||||
EMF_ZERO_SEQS = 0,
|
||||
EMF_ONE_BIG_SEQ = 1,
|
||||
EMF_LOTS_OF_SEQS = 2,
|
||||
EMF_BIG_ERROR = 3,
|
||||
EMF_SMALL_ERROR = 4,
|
||||
EMF_INVALID_OFFSET = 5,
|
||||
EMF_INVALID_MATCHLEN = 6,
|
||||
EMF_INVALID_LITLEN = 7,
|
||||
EMF_INVALID_LAST_LITS = 8
|
||||
} EMF_testCase;
|
||||
|
||||
size_t zstreamExternalMatchFinder(
|
||||
void* externalMatchState,
|
||||
ZSTD_Sequence* outSeqs, size_t outSeqsCapacity,
|
||||
const void* src, size_t srcSize,
|
||||
const void* dict, size_t dictSize,
|
||||
int compressionLevel,
|
||||
size_t windowSize
|
||||
);
|
||||
|
||||
#endif /* EXTERNAL_MATCHFINDER */
|
||||
+5
-4
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -171,6 +171,7 @@ FORCE_NOINLINE size_t ZSTD_decodeLiteralsHeader(ZSTD_DCtx* dctx, void const* src
|
||||
size_t lhSize, litSize, litCSize;
|
||||
U32 const lhlCode = (istart[0] >> 2) & 3;
|
||||
U32 const lhc = MEM_readLE32(istart);
|
||||
int const flags = ZSTD_DCtx_get_bmi2(dctx) ? HUF_flags_bmi2 : 0;
|
||||
switch(lhlCode)
|
||||
{
|
||||
case 0: case 1: default: /* note : default is impossible, since lhlCode into [0..3] */
|
||||
@@ -195,16 +196,16 @@ FORCE_NOINLINE size_t ZSTD_decodeLiteralsHeader(ZSTD_DCtx* dctx, void const* src
|
||||
RETURN_ERROR_IF(litSize > ZSTD_BLOCKSIZE_MAX, corruption_detected, "");
|
||||
RETURN_ERROR_IF(litCSize + lhSize > srcSize, corruption_detected, "");
|
||||
#ifndef HUF_FORCE_DECOMPRESS_X2
|
||||
return HUF_readDTableX1_wksp_bmi2(
|
||||
return HUF_readDTableX1_wksp(
|
||||
dctx->entropy.hufTable,
|
||||
istart+lhSize, litCSize,
|
||||
dctx->workspace, sizeof(dctx->workspace),
|
||||
ZSTD_DCtx_get_bmi2(dctx));
|
||||
flags);
|
||||
#else
|
||||
return HUF_readDTableX2_wksp(
|
||||
dctx->entropy.hufTable,
|
||||
istart+lhSize, litCSize,
|
||||
dctx->workspace, sizeof(dctx->workspace));
|
||||
dctx->workspace, sizeof(dctx->workspace), flags);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
+23
-9
@@ -1,5 +1,5 @@
|
||||
# ################################################################
|
||||
# Copyright (c) Facebook, Inc.
|
||||
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -34,9 +34,14 @@ ZSTDDIR = ../../lib
|
||||
PRGDIR = ../../programs
|
||||
CONTRIBDIR = ../../contrib
|
||||
|
||||
# TODO(embg) make it possible to plug in an arbitrary matchfinder as a .o file
|
||||
MATCHFINDER_DIR = $(CONTRIBDIR)/externalMatchfinder
|
||||
MATCHFINDER_SRC = $(MATCHFINDER_DIR)/matchfinder.c
|
||||
|
||||
FUZZ_CPPFLAGS := -I$(ZSTDDIR) -I$(ZSTDDIR)/common -I$(ZSTDDIR)/compress \
|
||||
-I$(ZSTDDIR)/dictBuilder -I$(ZSTDDIR)/deprecated -I$(ZSTDDIR)/legacy \
|
||||
-I$(CONTRIBDIR)/seekable_format -I$(PRGDIR) -DZSTD_MULTITHREAD -DZSTD_LEGACY_SUPPORT=1 $(CPPFLAGS)
|
||||
-I$(CONTRIBDIR)/seekable_format -I$(PRGDIR) -I$(MATCHFINDER_DIR) \
|
||||
-DZSTD_MULTITHREAD -DZSTD_LEGACY_SUPPORT=1 $(CPPFLAGS)
|
||||
FUZZ_EXTRA_FLAGS := -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \
|
||||
-Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \
|
||||
-Wstrict-prototypes -Wundef \
|
||||
@@ -69,7 +74,8 @@ FUZZ_SRC := \
|
||||
$(ZSTDCOMMON_SRC) \
|
||||
$(ZSTDCOMP_SRC) \
|
||||
$(ZSTDDICT_SRC) \
|
||||
$(ZSTDLEGACY_SRC)
|
||||
$(ZSTDLEGACY_SRC) \
|
||||
$(MATCHFINDER_SRC)
|
||||
FUZZ_SRC := $(sort $(wildcard $(FUZZ_SRC)))
|
||||
|
||||
FUZZ_D_OBJ1 := $(subst $(ZSTDDIR)/common/,d_lib_common_,$(FUZZ_SRC))
|
||||
@@ -78,9 +84,10 @@ FUZZ_D_OBJ3 := $(subst $(ZSTDDIR)/decompress/,d_lib_decompress_,$(FUZZ_D_OBJ2))
|
||||
FUZZ_D_OBJ4 := $(subst $(ZSTDDIR)/dictBuilder/,d_lib_dictBuilder_,$(FUZZ_D_OBJ3))
|
||||
FUZZ_D_OBJ5 := $(subst $(ZSTDDIR)/legacy/,d_lib_legacy_,$(FUZZ_D_OBJ4))
|
||||
FUZZ_D_OBJ6 := $(subst $(PRGDIR)/,d_prg_,$(FUZZ_D_OBJ5))
|
||||
FUZZ_D_OBJ7 := $(subst $\./,d_fuzz_,$(FUZZ_D_OBJ6))
|
||||
FUZZ_D_OBJ8 := $(FUZZ_D_OBJ7:.c=.o)
|
||||
FUZZ_DECOMPRESS_OBJ := $(FUZZ_D_OBJ8:.S=.o)
|
||||
FUZZ_D_OBJ7 := $(subst $(MATCHFINDER_DIR)/,d_matchfinder_,$(FUZZ_D_OBJ6))
|
||||
FUZZ_D_OBJ8 := $(subst $\./,d_fuzz_,$(FUZZ_D_OBJ7))
|
||||
FUZZ_D_OBJ9 := $(FUZZ_D_OBJ8:.c=.o)
|
||||
FUZZ_DECOMPRESS_OBJ := $(FUZZ_D_OBJ9:.S=.o)
|
||||
|
||||
FUZZ_RT_OBJ1 := $(subst $(ZSTDDIR)/common/,rt_lib_common_,$(FUZZ_SRC))
|
||||
FUZZ_RT_OBJ2 := $(subst $(ZSTDDIR)/compress/,rt_lib_compress_,$(FUZZ_RT_OBJ1))
|
||||
@@ -88,9 +95,10 @@ FUZZ_RT_OBJ3 := $(subst $(ZSTDDIR)/decompress/,rt_lib_decompress_,$(FUZZ_RT_OBJ2
|
||||
FUZZ_RT_OBJ4 := $(subst $(ZSTDDIR)/dictBuilder/,rt_lib_dictBuilder_,$(FUZZ_RT_OBJ3))
|
||||
FUZZ_RT_OBJ5 := $(subst $(ZSTDDIR)/legacy/,rt_lib_legacy_,$(FUZZ_RT_OBJ4))
|
||||
FUZZ_RT_OBJ6 := $(subst $(PRGDIR)/,rt_prg_,$(FUZZ_RT_OBJ5))
|
||||
FUZZ_RT_OBJ7 := $(subst $\./,rt_fuzz_,$(FUZZ_RT_OBJ6))
|
||||
FUZZ_RT_OBJ8 := $(FUZZ_RT_OBJ7:.c=.o)
|
||||
FUZZ_ROUND_TRIP_OBJ := $(FUZZ_RT_OBJ8:.S=.o)
|
||||
FUZZ_RT_OBJ7 := $(subst $(MATCHFINDER_DIR)/,rt_matchfinder_,$(FUZZ_RT_OBJ6))
|
||||
FUZZ_RT_OBJ8 := $(subst $\./,rt_fuzz_,$(FUZZ_RT_OBJ7))
|
||||
FUZZ_RT_OBJ9 := $(FUZZ_RT_OBJ8:.c=.o)
|
||||
FUZZ_ROUND_TRIP_OBJ := $(FUZZ_RT_OBJ9:.S=.o)
|
||||
|
||||
.PHONY: default all clean cleanall
|
||||
|
||||
@@ -143,6 +151,9 @@ rt_prg_%.o: $(PRGDIR)/%.c
|
||||
rt_fuzz_%.o: %.c
|
||||
$(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@
|
||||
|
||||
rt_matchfinder_%.o: $(MATCHFINDER_DIR)/%.c
|
||||
$(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@
|
||||
|
||||
d_lib_common_%.o: $(ZSTDDIR)/common/%.c
|
||||
$(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@
|
||||
|
||||
@@ -167,6 +178,9 @@ d_prg_%.o: $(PRGDIR)/%.c
|
||||
d_fuzz_%.o: %.c
|
||||
$(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@
|
||||
|
||||
d_matchfinder_%.o: $(MATCHFINDER_DIR)/%.c
|
||||
$(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@
|
||||
|
||||
simple_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_simple_round_trip.o
|
||||
$(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_simple_round_trip.o $(LIB_FUZZING_ENGINE) -o $@
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
+2
-3
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -26,8 +26,7 @@
|
||||
* @param MEM_FORCE_MEMORY_ACCESS:
|
||||
* This flag controls how the zstd library accesses unaligned memory.
|
||||
* It can be undefined, or 0 through 2. If it is undefined, it selects
|
||||
* the method to use based on the compiler. If testing with UBSAN set
|
||||
* MEM_FORCE_MEMORY_ACCESS=0 to use the standard compliant method.
|
||||
* the method to use based on the compiler.
|
||||
* @param FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
||||
* This is the canonical flag to enable deterministic builds for fuzzing.
|
||||
* Changes to zstd for fuzzing are gated behind this define.
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# ################################################################
|
||||
# Copyright (c) Facebook, Inc.
|
||||
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -13,8 +13,6 @@
|
||||
* compares the result with the original, and calls abort() on corruption.
|
||||
*/
|
||||
|
||||
#define HUF_STATIC_LINKING_ONLY
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -30,7 +28,13 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
|
||||
/* Select random parameters: #streams, X1 or X2 decoding, bmi2 */
|
||||
int const streams = FUZZ_dataProducer_int32Range(producer, 0, 1);
|
||||
int const symbols = FUZZ_dataProducer_int32Range(producer, 0, 1);
|
||||
int const bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid()) && FUZZ_dataProducer_int32Range(producer, 0, 1);
|
||||
int const flags = 0
|
||||
| (ZSTD_cpuid_bmi2(ZSTD_cpuid()) && FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_bmi2 : 0)
|
||||
| (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_optimalDepth : 0)
|
||||
| (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_preferRepeat : 0)
|
||||
| (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_suspectUncompressible : 0)
|
||||
| (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_disableAsm : 0)
|
||||
| (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_disableFast : 0);
|
||||
/* Select a random cBufSize - it may be too small */
|
||||
size_t const dBufSize = FUZZ_dataProducer_uint32Range(producer, 0, 8 * size + 500);
|
||||
size_t const maxTableLog = FUZZ_dataProducer_uint32Range(producer, 1, HUF_TABLELOG_MAX);
|
||||
@@ -42,18 +46,18 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
|
||||
size = FUZZ_dataProducer_remainingBytes(producer);
|
||||
|
||||
if (symbols == 0) {
|
||||
size_t const err = HUF_readDTableX1_wksp_bmi2(dt, src, size, wksp, wkspSize, bmi2);
|
||||
size_t const err = HUF_readDTableX1_wksp(dt, src, size, wksp, wkspSize, flags);
|
||||
if (ZSTD_isError(err))
|
||||
goto _out;
|
||||
} else {
|
||||
size_t const err = HUF_readDTableX2_wksp_bmi2(dt, src, size, wksp, wkspSize, bmi2);
|
||||
size_t const err = HUF_readDTableX2_wksp(dt, src, size, wksp, wkspSize, flags);
|
||||
if (ZSTD_isError(err))
|
||||
goto _out;
|
||||
}
|
||||
if (streams == 0)
|
||||
HUF_decompress1X_usingDTable_bmi2(dBuf, dBufSize, src, size, dt, bmi2);
|
||||
HUF_decompress1X_usingDTable(dBuf, dBufSize, src, size, dt, flags);
|
||||
else
|
||||
HUF_decompress4X_usingDTable_bmi2(dBuf, dBufSize, src, size, dt, bmi2);
|
||||
HUF_decompress4X_usingDTable(dBuf, dBufSize, src, size, dt, flags);
|
||||
|
||||
_out:
|
||||
free(dt);
|
||||
|
||||
+16
-14
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -13,8 +13,6 @@
|
||||
* compares the result with the original, and calls abort() on corruption.
|
||||
*/
|
||||
|
||||
#define HUF_STATIC_LINKING_ONLY
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -46,7 +44,13 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
|
||||
/* Select random parameters: #streams, X1 or X2 decoding, bmi2 */
|
||||
int const streams = FUZZ_dataProducer_int32Range(producer, 0, 1);
|
||||
int const symbols = FUZZ_dataProducer_int32Range(producer, 0, 1);
|
||||
int const bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid()) && FUZZ_dataProducer_int32Range(producer, 0, 1);
|
||||
int const flags = 0
|
||||
| (ZSTD_cpuid_bmi2(ZSTD_cpuid()) && FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_bmi2 : 0)
|
||||
| (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_optimalDepth : 0)
|
||||
| (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_preferRepeat : 0)
|
||||
| (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_suspectUncompressible : 0)
|
||||
| (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_disableAsm : 0)
|
||||
| (FUZZ_dataProducer_int32Range(producer, 0, 1) ? HUF_flags_disableFast : 0);
|
||||
/* Select a random cBufSize - it may be too small */
|
||||
size_t const cBufSize = FUZZ_dataProducer_uint32Range(producer, 0, 4 * size);
|
||||
/* Select a random tableLog - we'll adjust it up later */
|
||||
@@ -83,9 +87,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
|
||||
HUF_DTable* dt = (HUF_DTable*)FUZZ_malloc(HUF_DTABLE_SIZE(tableLog) * sizeof(HUF_DTable));
|
||||
dt[0] = tableLog * 0x01000001;
|
||||
|
||||
HUF_depth_mode depthMode = rand() & 1 ? HUF_depth_fast : HUF_depth_optimal;
|
||||
|
||||
tableLog = HUF_optimalTableLog(tableLog, size, maxSymbol, wksp, wkspSize, ct, count, depthMode);
|
||||
tableLog = HUF_optimalTableLog(tableLog, size, maxSymbol, wksp, wkspSize, ct, count, flags);
|
||||
FUZZ_ASSERT(tableLog <= 12);
|
||||
tableLog = HUF_buildCTable_wksp(ct, count, maxSymbol, tableLog, wksp, wkspSize);
|
||||
FUZZ_ZASSERT(tableLog);
|
||||
@@ -96,11 +98,11 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
|
||||
}
|
||||
FUZZ_ZASSERT(tableSize);
|
||||
if (symbols == 0) {
|
||||
FUZZ_ZASSERT(HUF_readDTableX1_wksp_bmi2(dt, cBuf, tableSize, wksp, wkspSize, bmi2));
|
||||
FUZZ_ZASSERT(HUF_readDTableX1_wksp(dt, cBuf, tableSize, wksp, wkspSize, flags));
|
||||
} else {
|
||||
size_t const ret = HUF_readDTableX2_wksp(dt, cBuf, tableSize, wksp, wkspSize);
|
||||
size_t const ret = HUF_readDTableX2_wksp(dt, cBuf, tableSize, wksp, wkspSize, flags);
|
||||
if (ERR_getErrorCode(ret) == ZSTD_error_tableLog_tooLarge) {
|
||||
FUZZ_ZASSERT(HUF_readDTableX1_wksp_bmi2(dt, cBuf, tableSize, wksp, wkspSize, bmi2));
|
||||
FUZZ_ZASSERT(HUF_readDTableX1_wksp(dt, cBuf, tableSize, wksp, wkspSize, flags));
|
||||
} else {
|
||||
FUZZ_ZASSERT(ret);
|
||||
}
|
||||
@@ -109,15 +111,15 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
|
||||
size_t cSize;
|
||||
size_t rSize;
|
||||
if (streams == 0) {
|
||||
cSize = HUF_compress1X_usingCTable_bmi2(cBuf, cBufSize, src, size, ct, bmi2);
|
||||
cSize = HUF_compress1X_usingCTable(cBuf, cBufSize, src, size, ct, flags);
|
||||
FUZZ_ZASSERT(cSize);
|
||||
if (cSize != 0)
|
||||
rSize = HUF_decompress1X_usingDTable_bmi2(rBuf, size, cBuf, cSize, dt, bmi2);
|
||||
rSize = HUF_decompress1X_usingDTable(rBuf, size, cBuf, cSize, dt, flags);
|
||||
} else {
|
||||
cSize = HUF_compress4X_usingCTable_bmi2(cBuf, cBufSize, src, size, ct, bmi2);
|
||||
cSize = HUF_compress4X_usingCTable(cBuf, cBufSize, src, size, ct, flags);
|
||||
FUZZ_ZASSERT(cSize);
|
||||
if (cSize != 0)
|
||||
rSize = HUF_decompress4X_usingDTable_bmi2(rBuf, size, cBuf, cSize, dt, bmi2);
|
||||
rSize = HUF_decompress4X_usingDTable(rBuf, size, cBuf, cSize, dt, flags);
|
||||
}
|
||||
if (cSize != 0) {
|
||||
FUZZ_ZASSERT(rSize);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -32,10 +32,14 @@ static void* literalsBuffer = NULL;
|
||||
static void* generatedSrc = NULL;
|
||||
static ZSTD_Sequence* generatedSequences = NULL;
|
||||
|
||||
static void* dictBuffer = NULL;
|
||||
static ZSTD_CDict* cdict = NULL;
|
||||
static ZSTD_DDict* ddict = NULL;
|
||||
|
||||
#define ZSTD_FUZZ_GENERATED_SRC_MAXSIZE (1 << 20) /* Allow up to 1MB generated data */
|
||||
#define ZSTD_FUZZ_GENERATED_LITERALS_SIZE (1 << 20) /* Fixed size 1MB literals buffer */
|
||||
#define ZSTD_FUZZ_MATCHLENGTH_MAXSIZE (1 << 18) /* Allow up to 256KB matches */
|
||||
#define ZSTD_FUZZ_GENERATED_DICT_MAXSIZE (1 << 18) /* Allow up to a 256KB dict */
|
||||
#define ZSTD_FUZZ_GENERATED_LITERALS_SIZE (1 << 18) /* Fixed size 256KB literals buffer */
|
||||
#define ZSTD_FUZZ_GENERATED_DICT_MAXSIZE (1 << ZSTD_WINDOWLOG_MAX_32) /* Allow up to 1 << ZSTD_WINDOWLOG_MAX_32 dictionary */
|
||||
#define ZSTD_FUZZ_MAX_NBSEQ (1 << 17) /* Maximum of 128K sequences */
|
||||
|
||||
/* Deterministic random number generator */
|
||||
@@ -55,9 +59,9 @@ static uint32_t FUZZ_RDG_rand(uint32_t* src)
|
||||
/* Make a pseudorandom string - this simple function exists to avoid
|
||||
* taking a dependency on datagen.h to have RDG_genBuffer().
|
||||
*/
|
||||
static char* generatePseudoRandomString(char* str, size_t size) {
|
||||
static char* generatePseudoRandomString(char* str, size_t size, FUZZ_dataProducer_t* producer) {
|
||||
const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK1234567890!@#$^&*()_";
|
||||
uint32_t seed = 0;
|
||||
uint32_t seed = FUZZ_dataProducer_uint32(producer);
|
||||
if (size) {
|
||||
for (size_t n = 0; n < size; n++) {
|
||||
int key = FUZZ_RDG_rand(&seed) % (int) (sizeof charset - 1);
|
||||
@@ -100,14 +104,14 @@ static size_t decodeSequences(void* dst, size_t nbSequences,
|
||||
size_t j = 0;
|
||||
size_t k = 0;
|
||||
if (dictSize != 0) {
|
||||
if (generatedSequences[i].offset > bytesWritten) {
|
||||
/* Offset goes into the dictionary */
|
||||
size_t offsetFromEndOfDict = generatedSequences[i].offset - bytesWritten;
|
||||
for (; k < offsetFromEndOfDict && k < matchLength; ++k) {
|
||||
op[k] = dictPtr[dictSize - offsetFromEndOfDict + k];
|
||||
if (generatedSequences[i].offset > bytesWritten) { /* Offset goes into the dictionary */
|
||||
size_t dictOffset = generatedSequences[i].offset - bytesWritten;
|
||||
size_t matchInDict = MIN(matchLength, dictOffset);
|
||||
for (; k < matchInDict; ++k) {
|
||||
op[k] = dictPtr[dictSize - dictOffset + k];
|
||||
}
|
||||
matchLength -= k;
|
||||
op += k;
|
||||
matchLength -= matchInDict;
|
||||
op += matchInDict;
|
||||
}
|
||||
}
|
||||
for (; j < matchLength; ++j) {
|
||||
@@ -139,8 +143,8 @@ static size_t generateRandomSequences(FUZZ_dataProducer_t* producer,
|
||||
size_t windowLog, ZSTD_sequenceFormat_e mode)
|
||||
{
|
||||
const uint32_t repCode = 0; /* not used by sequence ingestion api */
|
||||
const uint32_t windowSize = 1 << windowLog;
|
||||
const uint32_t blockSizeMax = MIN(128 << 10, 1 << windowLog);
|
||||
size_t windowSize = 1ULL << windowLog;
|
||||
size_t blockSizeMax = MIN(ZSTD_BLOCKSIZE_MAX, windowSize);
|
||||
uint32_t matchLengthMax = ZSTD_FUZZ_MATCHLENGTH_MAXSIZE;
|
||||
uint32_t bytesGenerated = 0;
|
||||
uint32_t nbSeqGenerated = 0;
|
||||
@@ -210,38 +214,31 @@ static size_t generateRandomSequences(FUZZ_dataProducer_t* producer,
|
||||
}
|
||||
generatedSequences[nbSeqGenerated++] = seq;
|
||||
isFirstSequence = 0;
|
||||
} }
|
||||
}
|
||||
}
|
||||
|
||||
if (mode == ZSTD_sf_explicitBlockDelimiters) {
|
||||
/* always end sequences with a block delimiter */
|
||||
const ZSTD_Sequence endBlock = {0, 0, 0, 0};
|
||||
assert(nbSeqGenerated < ZSTD_FUZZ_MAX_NBSEQ);
|
||||
generatedSequences[nbSeqGenerated++] = endBlock;
|
||||
}
|
||||
|
||||
return nbSeqGenerated;
|
||||
}
|
||||
|
||||
static size_t roundTripTest(void* result, size_t resultCapacity,
|
||||
void* compressed, size_t compressedCapacity,
|
||||
const void* src, size_t srcSize,
|
||||
const void* dict, size_t dictSize,
|
||||
const ZSTD_Sequence* seqs, size_t seqSize,
|
||||
int wLog, int cLevel, unsigned hasDict,
|
||||
unsigned hasDict,
|
||||
ZSTD_sequenceFormat_e mode)
|
||||
{
|
||||
size_t cSize;
|
||||
size_t dSize;
|
||||
|
||||
ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters);
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 0);
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, cLevel);
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, wLog);
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, ZSTD_MINMATCH_MIN);
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 1);
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, mode);
|
||||
if (hasDict) {
|
||||
FUZZ_ZASSERT(ZSTD_CCtx_loadDictionary(cctx, dict, dictSize));
|
||||
FUZZ_ZASSERT(ZSTD_DCtx_loadDictionary(dctx, dict, dictSize));
|
||||
FUZZ_ZASSERT(ZSTD_CCtx_refCDict(cctx, cdict));
|
||||
FUZZ_ZASSERT(ZSTD_DCtx_refDDict(dctx, ddict));
|
||||
}
|
||||
|
||||
cSize = ZSTD_compressSequences(cctx, compressed, compressedCapacity,
|
||||
@@ -272,7 +269,6 @@ int LLVMFuzzerTestOneInput(const uint8_t* src, size_t size)
|
||||
size_t cBufSize;
|
||||
size_t generatedSrcSize;
|
||||
size_t nbSequences;
|
||||
void* dictBuffer = NULL;
|
||||
size_t dictSize = 0;
|
||||
unsigned hasDict;
|
||||
unsigned wLog;
|
||||
@@ -281,23 +277,62 @@ int LLVMFuzzerTestOneInput(const uint8_t* src, size_t size)
|
||||
|
||||
FUZZ_dataProducer_t* const producer = FUZZ_dataProducer_create(src, size);
|
||||
FUZZ_ASSERT(producer);
|
||||
if (literalsBuffer == NULL) {
|
||||
|
||||
if (!cctx) {
|
||||
cctx = ZSTD_createCCtx();
|
||||
FUZZ_ASSERT(cctx);
|
||||
}
|
||||
if (!dctx) {
|
||||
dctx = ZSTD_createDCtx();
|
||||
FUZZ_ASSERT(dctx);
|
||||
}
|
||||
|
||||
/* Generate window log first so we don't generate offsets too large */
|
||||
wLog = FUZZ_dataProducer_uint32Range(producer, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX);
|
||||
cLevel = FUZZ_dataProducer_int32Range(producer, -3, 22);
|
||||
mode = (ZSTD_sequenceFormat_e)FUZZ_dataProducer_int32Range(producer, 0, 1);
|
||||
|
||||
ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters);
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 0);
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, cLevel);
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, wLog);
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, ZSTD_MINMATCH_MIN);
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 1);
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, mode);
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_forceAttachDict, ZSTD_dictForceAttach);
|
||||
|
||||
if (!literalsBuffer) {
|
||||
literalsBuffer = FUZZ_malloc(ZSTD_FUZZ_GENERATED_LITERALS_SIZE);
|
||||
FUZZ_ASSERT(literalsBuffer);
|
||||
literalsBuffer = generatePseudoRandomString(literalsBuffer, ZSTD_FUZZ_GENERATED_LITERALS_SIZE);
|
||||
literalsBuffer = generatePseudoRandomString(literalsBuffer, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, producer);
|
||||
}
|
||||
|
||||
if (!dictBuffer) { /* Generate global dictionary buffer */
|
||||
ZSTD_compressionParameters cParams;
|
||||
|
||||
/* Generate a large dictionary buffer */
|
||||
dictBuffer = calloc(ZSTD_FUZZ_GENERATED_DICT_MAXSIZE, 1);
|
||||
FUZZ_ASSERT(dictBuffer);
|
||||
|
||||
/* Create global cdict and ddict */
|
||||
cParams = ZSTD_getCParams(1, ZSTD_FUZZ_GENERATED_SRC_MAXSIZE, ZSTD_FUZZ_GENERATED_DICT_MAXSIZE);
|
||||
cParams.minMatch = ZSTD_MINMATCH_MIN;
|
||||
cParams.hashLog = ZSTD_HASHLOG_MIN;
|
||||
cParams.chainLog = ZSTD_CHAINLOG_MIN;
|
||||
|
||||
cdict = ZSTD_createCDict_advanced(dictBuffer, ZSTD_FUZZ_GENERATED_DICT_MAXSIZE, ZSTD_dlm_byRef, ZSTD_dct_rawContent, cParams, ZSTD_defaultCMem);
|
||||
ddict = ZSTD_createDDict_advanced(dictBuffer, ZSTD_FUZZ_GENERATED_DICT_MAXSIZE, ZSTD_dlm_byRef, ZSTD_dct_rawContent, ZSTD_defaultCMem);
|
||||
FUZZ_ASSERT(cdict);
|
||||
FUZZ_ASSERT(ddict);
|
||||
}
|
||||
|
||||
FUZZ_ASSERT(cdict);
|
||||
FUZZ_ASSERT(ddict);
|
||||
|
||||
hasDict = FUZZ_dataProducer_uint32Range(producer, 0, 1);
|
||||
if (hasDict) {
|
||||
dictSize = FUZZ_dataProducer_uint32Range(producer, 1, ZSTD_FUZZ_GENERATED_DICT_MAXSIZE);
|
||||
dictBuffer = FUZZ_malloc(dictSize);
|
||||
FUZZ_ASSERT(dictBuffer);
|
||||
dictBuffer = generatePseudoRandomString(dictBuffer, dictSize);
|
||||
dictSize = ZSTD_FUZZ_GENERATED_DICT_MAXSIZE;
|
||||
}
|
||||
/* Generate window log first so we don't generate offsets too large */
|
||||
wLog = FUZZ_dataProducer_uint32Range(producer, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX_32);
|
||||
cLevel = FUZZ_dataProducer_int32Range(producer, -3, 22);
|
||||
mode = (ZSTD_sequenceFormat_e)FUZZ_dataProducer_int32Range(producer, 0, 1);
|
||||
|
||||
if (!generatedSequences) {
|
||||
generatedSequences = FUZZ_malloc(sizeof(ZSTD_Sequence)*ZSTD_FUZZ_MAX_NBSEQ);
|
||||
@@ -305,8 +340,10 @@ int LLVMFuzzerTestOneInput(const uint8_t* src, size_t size)
|
||||
if (!generatedSrc) {
|
||||
generatedSrc = FUZZ_malloc(ZSTD_FUZZ_GENERATED_SRC_MAXSIZE);
|
||||
}
|
||||
|
||||
nbSequences = generateRandomSequences(producer, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictSize, wLog, mode);
|
||||
generatedSrcSize = decodeSequences(generatedSrc, nbSequences, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictBuffer, dictSize, mode);
|
||||
|
||||
/* Note : in explicit block delimiters mode,
|
||||
* the fuzzer might generate a lot of small blocks.
|
||||
* In which case, the final compressed size might be > ZSTD_compressBound().
|
||||
@@ -318,30 +355,17 @@ int LLVMFuzzerTestOneInput(const uint8_t* src, size_t size)
|
||||
rBufSize = generatedSrcSize;
|
||||
rBuf = FUZZ_malloc(rBufSize);
|
||||
|
||||
if (!cctx) {
|
||||
cctx = ZSTD_createCCtx();
|
||||
FUZZ_ASSERT(cctx);
|
||||
}
|
||||
if (!dctx) {
|
||||
dctx = ZSTD_createDCtx();
|
||||
FUZZ_ASSERT(dctx);
|
||||
}
|
||||
|
||||
{ const size_t result = roundTripTest(rBuf, rBufSize,
|
||||
cBuf, cBufSize,
|
||||
generatedSrc, generatedSrcSize,
|
||||
dictBuffer, dictSize,
|
||||
generatedSequences, nbSequences,
|
||||
(int)wLog, cLevel, hasDict, mode);
|
||||
hasDict, mode);
|
||||
FUZZ_ASSERT(result <= generatedSrcSize); /* can be 0 when no round-trip */
|
||||
}
|
||||
|
||||
free(rBuf);
|
||||
free(cBuf);
|
||||
FUZZ_dataProducer_free(producer);
|
||||
if (hasDict) {
|
||||
free(dictBuffer);
|
||||
}
|
||||
#ifndef STATEFUL_FUZZING
|
||||
ZSTD_freeCCtx(cctx); cctx = NULL;
|
||||
ZSTD_freeDCtx(dctx); dctx = NULL;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -26,6 +26,23 @@
|
||||
static ZSTD_CCtx *cctx = NULL;
|
||||
static ZSTD_DCtx *dctx = NULL;
|
||||
|
||||
static size_t getDecompressionMargin(void const* compressed, size_t cSize, size_t srcSize, int hasSmallBlocks)
|
||||
{
|
||||
size_t margin = ZSTD_decompressionMargin(compressed, cSize);
|
||||
if (!hasSmallBlocks) {
|
||||
/* The macro should be correct in this case, but it may be smaller
|
||||
* because of e.g. block splitting, so take the smaller of the two.
|
||||
*/
|
||||
ZSTD_frameHeader zfh;
|
||||
size_t marginM;
|
||||
FUZZ_ZASSERT(ZSTD_getFrameHeader(&zfh, compressed, cSize));
|
||||
marginM = ZSTD_DECOMPRESSION_MARGIN(srcSize, zfh.blockSizeMax);
|
||||
if (marginM < margin)
|
||||
margin = marginM;
|
||||
}
|
||||
return margin;
|
||||
}
|
||||
|
||||
static size_t roundTripTest(void *result, size_t resultCapacity,
|
||||
void *compressed, size_t compressedCapacity,
|
||||
const void *src, size_t srcSize,
|
||||
@@ -67,6 +84,25 @@ static size_t roundTripTest(void *result, size_t resultCapacity,
|
||||
}
|
||||
dSize = ZSTD_decompressDCtx(dctx, result, resultCapacity, compressed, cSize);
|
||||
FUZZ_ZASSERT(dSize);
|
||||
FUZZ_ASSERT_MSG(dSize == srcSize, "Incorrect regenerated size");
|
||||
FUZZ_ASSERT_MSG(!FUZZ_memcmp(src, result, dSize), "Corruption!");
|
||||
|
||||
{
|
||||
size_t margin = getDecompressionMargin(compressed, cSize, srcSize, targetCBlockSize);
|
||||
size_t const outputSize = srcSize + margin;
|
||||
char* const output = (char*)FUZZ_malloc(outputSize);
|
||||
char* const input = output + outputSize - cSize;
|
||||
FUZZ_ASSERT(outputSize >= cSize);
|
||||
memcpy(input, compressed, cSize);
|
||||
|
||||
dSize = ZSTD_decompressDCtx(dctx, output, outputSize, input, cSize);
|
||||
FUZZ_ZASSERT(dSize);
|
||||
FUZZ_ASSERT_MSG(dSize == srcSize, "Incorrect regenerated size");
|
||||
FUZZ_ASSERT_MSG(!FUZZ_memcmp(src, output, srcSize), "Corruption!");
|
||||
|
||||
free(output);
|
||||
}
|
||||
|
||||
/* When superblock is enabled make sure we don't expand the block more than expected.
|
||||
* NOTE: This test is currently disabled because superblock mode can arbitrarily
|
||||
* expand the block in the worst case. Once superblock mode has been improved we can
|
||||
@@ -120,13 +156,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
|
||||
FUZZ_ASSERT(dctx);
|
||||
}
|
||||
|
||||
{
|
||||
size_t const result =
|
||||
roundTripTest(rBuf, rBufSize, cBuf, cBufSize, src, size, producer);
|
||||
FUZZ_ZASSERT(result);
|
||||
FUZZ_ASSERT_MSG(result == size, "Incorrect regenerated size");
|
||||
FUZZ_ASSERT_MSG(!FUZZ_memcmp(src, rBuf, size), "Corruption!");
|
||||
}
|
||||
roundTripTest(rBuf, rBufSize, cBuf, cBufSize, src, size, producer);
|
||||
free(rBuf);
|
||||
free(cBuf);
|
||||
FUZZ_dataProducer_free(producer);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -99,14 +99,14 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
|
||||
|
||||
while (size > 0) {
|
||||
ZSTD_inBuffer in = makeInBuffer(&src, &size, producer);
|
||||
while (in.pos != in.size) {
|
||||
do {
|
||||
size_t const rc = ZSTD_decompressStream(dstream, &out, &in);
|
||||
if (ZSTD_isError(rc)) goto error;
|
||||
if (out.pos == out.size) {
|
||||
if (stableOutBuffer) goto error;
|
||||
out = makeOutBuffer(producer, buf, bufSize);
|
||||
}
|
||||
size_t const rc = ZSTD_decompressStream(dstream, &out, &in);
|
||||
if (ZSTD_isError(rc)) goto error;
|
||||
}
|
||||
} while (in.pos != in.size);
|
||||
}
|
||||
|
||||
error:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -166,6 +166,24 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
|
||||
FUZZ_ZASSERT(rSize);
|
||||
FUZZ_ASSERT_MSG(rSize == size, "Incorrect regenerated size");
|
||||
FUZZ_ASSERT_MSG(!FUZZ_memcmp(src, rBuf, size), "Corruption!");
|
||||
|
||||
/* Test in-place decompression (note the macro doesn't work in this case) */
|
||||
{
|
||||
size_t const margin = ZSTD_decompressionMargin(cBuf, cSize);
|
||||
size_t const outputSize = size + margin;
|
||||
char* const output = (char*)FUZZ_malloc(outputSize);
|
||||
char* const input = output + outputSize - cSize;
|
||||
size_t dSize;
|
||||
FUZZ_ASSERT(outputSize >= cSize);
|
||||
memcpy(input, cBuf, cSize);
|
||||
|
||||
dSize = ZSTD_decompressDCtx(dctx, output, outputSize, input, cSize);
|
||||
FUZZ_ZASSERT(dSize);
|
||||
FUZZ_ASSERT_MSG(dSize == size, "Incorrect regenerated size");
|
||||
FUZZ_ASSERT_MSG(!FUZZ_memcmp(src, output, size), "Corruption!");
|
||||
|
||||
free(output);
|
||||
}
|
||||
}
|
||||
|
||||
FUZZ_dataProducer_free(producer);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "fuzz_helpers.h"
|
||||
#include "zstd.h"
|
||||
#include "zdict.h"
|
||||
#include "matchfinder.h"
|
||||
|
||||
const int kMinClevel = -3;
|
||||
const int kMaxClevel = 19;
|
||||
@@ -26,9 +27,14 @@ static void set(ZSTD_CCtx *cctx, ZSTD_cParameter param, int value)
|
||||
FUZZ_ZASSERT(ZSTD_CCtx_setParameter(cctx, param, value));
|
||||
}
|
||||
|
||||
static unsigned produceParamValue(unsigned min, unsigned max,
|
||||
FUZZ_dataProducer_t *producer) {
|
||||
return FUZZ_dataProducer_uint32Range(producer, min, max);
|
||||
}
|
||||
|
||||
static void setRand(ZSTD_CCtx *cctx, ZSTD_cParameter param, unsigned min,
|
||||
unsigned max, FUZZ_dataProducer_t *producer) {
|
||||
unsigned const value = FUZZ_dataProducer_uint32Range(producer, min, max);
|
||||
unsigned const value = produceParamValue(min, max, producer);
|
||||
set(cctx, param, value);
|
||||
}
|
||||
|
||||
@@ -65,6 +71,17 @@ ZSTD_parameters FUZZ_randomParams(size_t srcSize, FUZZ_dataProducer_t *producer)
|
||||
return params;
|
||||
}
|
||||
|
||||
static void setExternalMatchFinderParams(ZSTD_CCtx *cctx, FUZZ_dataProducer_t *producer) {
|
||||
ZSTD_registerExternalMatchFinder(
|
||||
cctx,
|
||||
NULL,
|
||||
simpleExternalMatchFinder
|
||||
);
|
||||
setRand(cctx, ZSTD_c_enableMatchFinderFallback, 0, 1, producer);
|
||||
FUZZ_ZASSERT(ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 0));
|
||||
FUZZ_ZASSERT(ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_disable));
|
||||
}
|
||||
|
||||
void FUZZ_setRandomParameters(ZSTD_CCtx *cctx, size_t srcSize, FUZZ_dataProducer_t *producer)
|
||||
{
|
||||
ZSTD_compressionParameters cParams = FUZZ_randomCParams(srcSize, producer);
|
||||
@@ -90,8 +107,14 @@ void FUZZ_setRandomParameters(ZSTD_CCtx *cctx, size_t srcSize, FUZZ_dataProducer
|
||||
ZSTD_LDM_HASHRATELOG_MAX, producer);
|
||||
/* Set misc parameters */
|
||||
#ifndef ZSTD_MULTITHREAD
|
||||
setRand(cctx, ZSTD_c_nbWorkers, 0, 0, producer);
|
||||
setRand(cctx, ZSTD_c_rsyncable, 0, 0, producer);
|
||||
// To reproduce with or without ZSTD_MULTITHREAD, we are going to use
|
||||
// the same amount of entropy.
|
||||
unsigned const nbWorkers_value = produceParamValue(0, 2, producer);
|
||||
unsigned const rsyncable_value = produceParamValue(0, 1, producer);
|
||||
(void)nbWorkers_value;
|
||||
(void)rsyncable_value;
|
||||
set(cctx, ZSTD_c_nbWorkers, 0);
|
||||
set(cctx, ZSTD_c_rsyncable, 0);
|
||||
#else
|
||||
setRand(cctx, ZSTD_c_nbWorkers, 0, 2, producer);
|
||||
setRand(cctx, ZSTD_c_rsyncable, 0, 1, producer);
|
||||
@@ -104,12 +127,21 @@ void FUZZ_setRandomParameters(ZSTD_CCtx *cctx, size_t srcSize, FUZZ_dataProducer
|
||||
setRand(cctx, ZSTD_c_useBlockSplitter, 0, 2, producer);
|
||||
setRand(cctx, ZSTD_c_deterministicRefPrefix, 0, 1, producer);
|
||||
setRand(cctx, ZSTD_c_prefetchCDictTables, 0, 2, producer);
|
||||
setRand(cctx, ZSTD_c_maxBlockSize, ZSTD_BLOCKSIZE_MAX_MIN, ZSTD_BLOCKSIZE_MAX, producer);
|
||||
setRand(cctx, ZSTD_c_validateSequences, 0, 1, producer);
|
||||
setRand(cctx, ZSTD_c_searchForExternalRepcodes, 0, 2, producer);
|
||||
if (FUZZ_dataProducer_uint32Range(producer, 0, 1) == 0) {
|
||||
setRand(cctx, ZSTD_c_srcSizeHint, ZSTD_SRCSIZEHINT_MIN, 2 * srcSize, producer);
|
||||
}
|
||||
if (FUZZ_dataProducer_uint32Range(producer, 0, 1) == 0) {
|
||||
setRand(cctx, ZSTD_c_targetCBlockSize, ZSTD_TARGETCBLOCKSIZE_MIN, ZSTD_TARGETCBLOCKSIZE_MAX, producer);
|
||||
}
|
||||
|
||||
if (FUZZ_dataProducer_uint32Range(producer, 0, 10) == 1) {
|
||||
setExternalMatchFinderParams(cctx, producer);
|
||||
} else {
|
||||
ZSTD_registerExternalMatchFinder(cctx, NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
FUZZ_dict_t FUZZ_train(void const* src, size_t srcSize, FUZZ_dataProducer_t *producer)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
+447
-90
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -25,7 +25,8 @@
|
||||
#include <stdlib.h> /* free */
|
||||
#include <stdio.h> /* fgets, sscanf */
|
||||
#include <string.h> /* strcmp */
|
||||
#undef NDEBUG
|
||||
#include <time.h> /* time(), time_t */
|
||||
#undef NDEBUG /* always enable assert() */
|
||||
#include <assert.h>
|
||||
#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressContinue, ZSTD_compressBlock */
|
||||
#include "debug.h" /* DEBUG_STATIC_ASSERT */
|
||||
@@ -82,8 +83,8 @@ static UTIL_time_t g_displayClock = UTIL_TIME_INITIALIZER;
|
||||
void FUZ_bug976(void);
|
||||
void FUZ_bug976(void)
|
||||
{ /* these constants shall not depend on MIN() macro */
|
||||
assert(ZSTD_HASHLOG_MAX < 31);
|
||||
assert(ZSTD_CHAINLOG_MAX < 31);
|
||||
DEBUG_STATIC_ASSERT(ZSTD_HASHLOG_MAX < 31);
|
||||
DEBUG_STATIC_ASSERT(ZSTD_CHAINLOG_MAX < 31);
|
||||
}
|
||||
|
||||
|
||||
@@ -118,23 +119,24 @@ static U32 FUZ_highbit32(U32 v32)
|
||||
/*=============================================
|
||||
* Test macros
|
||||
=============================================*/
|
||||
#define CHECK_Z(f) { \
|
||||
size_t const err = f; \
|
||||
if (ZSTD_isError(err)) { \
|
||||
DISPLAY("Error => %s : %s ", \
|
||||
#f, ZSTD_getErrorName(err)); \
|
||||
exit(1); \
|
||||
#define CHECK(fn) { if(!(fn)) { DISPLAYLEVEL(1, "Error : test (%s) failed \n", #fn); exit(1); } }
|
||||
|
||||
#define CHECK_Z(f) { \
|
||||
size_t const err = f; \
|
||||
if (ZSTD_isError(err)) { \
|
||||
DISPLAY("Error => %s : %s ", \
|
||||
#f, ZSTD_getErrorName(err)); \
|
||||
exit(1); \
|
||||
} }
|
||||
|
||||
#define CHECK_VAR(var, fn) var = fn; if (ZSTD_isError(var)) { DISPLAYLEVEL(1, "%s : fails : %s \n", #fn, ZSTD_getErrorName(var)); goto _output_error; }
|
||||
#define CHECK_VAR(var, fn) var = fn; if (ZSTD_isError(var)) { DISPLAYLEVEL(1, "%s : fails : %s \n", #fn, ZSTD_getErrorName(var)); exit(1); }
|
||||
#define CHECK_NEWV(var, fn) size_t const CHECK_VAR(var, fn)
|
||||
#define CHECK(fn) { CHECK_NEWV(__err, fn); }
|
||||
#define CHECKPLUS(var, fn, more) { CHECK_NEWV(var, fn); more; }
|
||||
|
||||
#define CHECK_OP(op, lhs, rhs) { \
|
||||
if (!((lhs) op (rhs))) { \
|
||||
DISPLAY("Error L%u => FAILED %s %s %s ", __LINE__, #lhs, #op, #rhs); \
|
||||
goto _output_error; \
|
||||
exit(1); \
|
||||
} \
|
||||
}
|
||||
#define CHECK_EQ(lhs, rhs) CHECK_OP(==, lhs, rhs)
|
||||
@@ -338,6 +340,7 @@ static void FUZ_decodeSequences(BYTE* dst, ZSTD_Sequence* seqs, size_t seqsSize,
|
||||
}
|
||||
|
||||
#ifdef ZSTD_MULTITHREAD
|
||||
|
||||
typedef struct {
|
||||
ZSTD_CCtx* cctx;
|
||||
ZSTD_threadPool* pool;
|
||||
@@ -429,8 +432,8 @@ static int threadPoolTests(void) {
|
||||
|
||||
ZSTD_pthread_create(&t1, NULL, threadPoolTests_compressionJob, &p1);
|
||||
ZSTD_pthread_create(&t2, NULL, threadPoolTests_compressionJob, &p2);
|
||||
ZSTD_pthread_join(t1, NULL);
|
||||
ZSTD_pthread_join(t2, NULL);
|
||||
ZSTD_pthread_join(t1);
|
||||
ZSTD_pthread_join(t2);
|
||||
|
||||
assert(!memcmp(decodedBuffer, decodedBuffer2, CNBuffSize));
|
||||
free(decodedBuffer2);
|
||||
@@ -461,6 +464,101 @@ _output_error:
|
||||
* Unit tests
|
||||
=============================================*/
|
||||
|
||||
static void test_compressBound(unsigned tnb)
|
||||
{
|
||||
DISPLAYLEVEL(3, "test%3u : compressBound : ", tnb);
|
||||
|
||||
/* check ZSTD_compressBound == ZSTD_COMPRESSBOUND
|
||||
* for a large range of known valid values */
|
||||
DEBUG_STATIC_ASSERT(sizeof(size_t) >= 4);
|
||||
{ int s;
|
||||
for (s=0; s<30; s++) {
|
||||
size_t const w = (size_t)1 << s;
|
||||
CHECK_EQ(ZSTD_compressBound(w), ZSTD_COMPRESSBOUND(w));
|
||||
} }
|
||||
|
||||
/* Ensure error if srcSize too big */
|
||||
{ size_t const w = ZSTD_MAX_INPUT_SIZE + 1;
|
||||
CHECK(ZSTD_isError(ZSTD_compressBound(w))); /* must fail */
|
||||
CHECK_EQ(ZSTD_COMPRESSBOUND(w), 0);
|
||||
}
|
||||
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
}
|
||||
|
||||
static void test_decompressBound(unsigned tnb)
|
||||
{
|
||||
DISPLAYLEVEL(3, "test%3u : decompressBound : ", tnb);
|
||||
|
||||
/* Simple compression, with size : should provide size; */
|
||||
{ const char example[] = "abcd";
|
||||
char cBuffer[ZSTD_COMPRESSBOUND(sizeof(example))];
|
||||
size_t const cSize = ZSTD_compress(cBuffer, sizeof(cBuffer), example, sizeof(example), 0);
|
||||
CHECK_Z(cSize);
|
||||
CHECK_EQ(ZSTD_decompressBound(cBuffer, cSize), (unsigned long long)sizeof(example));
|
||||
}
|
||||
|
||||
/* Simple small compression without size : should provide 1 block size */
|
||||
{ char cBuffer[ZSTD_COMPRESSBOUND(0)];
|
||||
ZSTD_outBuffer out = { cBuffer, sizeof(cBuffer), 0 };
|
||||
ZSTD_inBuffer in = { NULL, 0, 0 };
|
||||
ZSTD_CCtx* const cctx = ZSTD_createCCtx();
|
||||
assert(cctx);
|
||||
CHECK_Z( ZSTD_initCStream(cctx, 0) );
|
||||
CHECK_Z( ZSTD_compressStream(cctx, &out, &in) );
|
||||
CHECK_EQ( ZSTD_endStream(cctx, &out), 0 );
|
||||
CHECK_EQ( ZSTD_decompressBound(cBuffer, out.pos), ZSTD_BLOCKSIZE_MAX );
|
||||
ZSTD_freeCCtx(cctx);
|
||||
}
|
||||
|
||||
/* Attempt to overflow 32-bit intermediate multiplication result
|
||||
* This requires dBound >= 4 GB, aka 2^32.
|
||||
* This requires 2^32 / 2^17 = 2^15 blocks
|
||||
* => create 2^15 blocks (can be empty, or just 1 byte). */
|
||||
{ const char input[] = "a";
|
||||
size_t const nbBlocks = (1 << 15) + 1;
|
||||
size_t blockNb;
|
||||
size_t const outCapacity = 1 << 18; /* large margin */
|
||||
char* const outBuffer = malloc (outCapacity);
|
||||
ZSTD_outBuffer out = { outBuffer, outCapacity, 0 };
|
||||
ZSTD_CCtx* const cctx = ZSTD_createCCtx();
|
||||
assert(cctx);
|
||||
assert(outBuffer);
|
||||
CHECK_Z( ZSTD_initCStream(cctx, 0) );
|
||||
for (blockNb=0; blockNb<nbBlocks; blockNb++) {
|
||||
ZSTD_inBuffer in = { input, sizeof(input), 0 };
|
||||
CHECK_Z( ZSTD_compressStream(cctx, &out, &in) );
|
||||
CHECK_EQ( ZSTD_flushStream(cctx, &out), 0 );
|
||||
}
|
||||
CHECK_EQ( ZSTD_endStream(cctx, &out), 0 );
|
||||
CHECK( ZSTD_decompressBound(outBuffer, out.pos) > 0x100000000LLU /* 4 GB */ );
|
||||
ZSTD_freeCCtx(cctx);
|
||||
free(outBuffer);
|
||||
}
|
||||
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
}
|
||||
|
||||
static void test_setCParams(unsigned tnb)
|
||||
{
|
||||
ZSTD_CCtx* const cctx = ZSTD_createCCtx();
|
||||
ZSTD_compressionParameters cparams;
|
||||
assert(cctx);
|
||||
|
||||
DISPLAYLEVEL(3, "test%3u : ZSTD_CCtx_setCParams : ", tnb);
|
||||
|
||||
/* valid cparams */
|
||||
cparams = ZSTD_getCParams(1, 0, 0);
|
||||
CHECK_Z(ZSTD_CCtx_setCParams(cctx, cparams));
|
||||
|
||||
/* invalid cparams (must fail) */
|
||||
cparams.windowLog = 99;
|
||||
CHECK(ZSTD_isError(ZSTD_CCtx_setCParams(cctx, cparams)));
|
||||
|
||||
free(cctx);
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
}
|
||||
|
||||
static int basicUnitTests(U32 const seed, double compressibility)
|
||||
{
|
||||
size_t const CNBuffSize = 5 MB;
|
||||
@@ -507,6 +605,12 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
DISPLAYLEVEL(3, "%u (OK) \n", vn);
|
||||
}
|
||||
|
||||
test_compressBound(testNb++);
|
||||
|
||||
test_decompressBound(testNb++);
|
||||
|
||||
test_setCParams(testNb++);
|
||||
|
||||
DISPLAYLEVEL(3, "test%3u : ZSTD_adjustCParams : ", testNb++);
|
||||
{
|
||||
ZSTD_compressionParameters params;
|
||||
@@ -580,6 +684,17 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
if (r != CNBuffSize) goto _output_error; }
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : decompress %u bytes with Huffman assembly disabled : ", testNb++, (unsigned)CNBuffSize);
|
||||
{
|
||||
ZSTD_DCtx* dctx = ZSTD_createDCtx();
|
||||
size_t r;
|
||||
CHECK_Z(ZSTD_DCtx_setParameter(dctx, ZSTD_d_disableHuffmanAssembly, 1));
|
||||
r = ZSTD_decompress(decodedBuffer, CNBuffSize, compressedBuffer, cSize);
|
||||
if (r != CNBuffSize || memcmp(decodedBuffer, CNBuffer, CNBuffSize)) goto _output_error;
|
||||
ZSTD_freeDCtx(dctx);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : check decompressed result : ", testNb++);
|
||||
{ size_t u;
|
||||
for (u=0; u<CNBuffSize; u++) {
|
||||
@@ -1117,6 +1232,60 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : in-place decompression : ", testNb++);
|
||||
cSize = ZSTD_compress(compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize, -ZSTD_BLOCKSIZE_MAX);
|
||||
CHECK_Z(cSize);
|
||||
CHECK_LT(CNBuffSize, cSize);
|
||||
{
|
||||
size_t const margin = ZSTD_decompressionMargin(compressedBuffer, cSize);
|
||||
size_t const outputSize = (CNBuffSize + margin);
|
||||
char* output = malloc(outputSize);
|
||||
char* input = output + outputSize - cSize;
|
||||
CHECK_LT(cSize, CNBuffSize + margin);
|
||||
CHECK(output != NULL);
|
||||
CHECK_Z(margin);
|
||||
CHECK(margin <= ZSTD_DECOMPRESSION_MARGIN(CNBuffSize, ZSTD_BLOCKSIZE_MAX));
|
||||
memcpy(input, compressedBuffer, cSize);
|
||||
|
||||
{
|
||||
size_t const dSize = ZSTD_decompress(output, outputSize, input, cSize);
|
||||
CHECK_Z(dSize);
|
||||
CHECK_EQ(dSize, CNBuffSize);
|
||||
}
|
||||
CHECK(!memcmp(output, CNBuffer, CNBuffSize));
|
||||
free(output);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : in-place decompression with 2 frames : ", testNb++);
|
||||
cSize = ZSTD_compress(compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize / 3, -ZSTD_BLOCKSIZE_MAX);
|
||||
CHECK_Z(cSize);
|
||||
{
|
||||
size_t const cSize2 = ZSTD_compress((char*)compressedBuffer + cSize, compressedBufferSize - cSize, (char const*)CNBuffer + (CNBuffSize / 3), CNBuffSize / 3, -ZSTD_BLOCKSIZE_MAX);
|
||||
CHECK_Z(cSize2);
|
||||
cSize += cSize2;
|
||||
}
|
||||
{
|
||||
size_t const srcSize = (CNBuffSize / 3) * 2;
|
||||
size_t const margin = ZSTD_decompressionMargin(compressedBuffer, cSize);
|
||||
size_t const outputSize = (CNBuffSize + margin);
|
||||
char* output = malloc(outputSize);
|
||||
char* input = output + outputSize - cSize;
|
||||
CHECK_LT(cSize, CNBuffSize + margin);
|
||||
CHECK(output != NULL);
|
||||
CHECK_Z(margin);
|
||||
memcpy(input, compressedBuffer, cSize);
|
||||
|
||||
{
|
||||
size_t const dSize = ZSTD_decompress(output, outputSize, input, cSize);
|
||||
CHECK_Z(dSize);
|
||||
CHECK_EQ(dSize, srcSize);
|
||||
}
|
||||
CHECK(!memcmp(output, CNBuffer, srcSize));
|
||||
free(output);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3d: superblock uncompressible data, too many nocompress superblocks : ", testNb++);
|
||||
{
|
||||
ZSTD_CCtx* const cctx = ZSTD_createCCtx();
|
||||
@@ -1579,7 +1748,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : init CCtx for small level %u (should work again) : ", testNb++, 1);
|
||||
CHECK( ZSTD_compressBegin(staticCCtx, 1) );
|
||||
CHECK_Z( ZSTD_compressBegin(staticCCtx, 1) );
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : use CStream on CCtx-sized static context (should fail) : ", testNb++);
|
||||
@@ -1622,6 +1791,94 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
if (!ZSTD_isError(r)) goto _output_error;
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : test estimation functions with default cctx params : ", testNb++);
|
||||
{
|
||||
// Test ZSTD_estimateCCtxSize_usingCCtxParams
|
||||
{
|
||||
ZSTD_CCtx_params* params = ZSTD_createCCtxParams();
|
||||
size_t const cctxSizeDefault = ZSTD_estimateCCtxSize_usingCCtxParams(params);
|
||||
staticCCtx = ZSTD_initStaticCCtx(staticCCtxBuffer, cctxSizeDefault);
|
||||
CHECK_VAR(cSize, ZSTD_compressCCtx(staticCCtx,
|
||||
compressedBuffer, compressedBufferSize,
|
||||
CNBuffer, CNBuffSize, 3));
|
||||
|
||||
{
|
||||
size_t const r = ZSTD_decompressDCtx(staticDCtx,
|
||||
decodedBuffer, CNBuffSize,
|
||||
compressedBuffer, cSize);
|
||||
if (r != CNBuffSize) goto _output_error;
|
||||
if (memcmp(decodedBuffer, CNBuffer, CNBuffSize)) goto _output_error;
|
||||
}
|
||||
ZSTD_freeCCtxParams(params);
|
||||
}
|
||||
|
||||
// Test ZSTD_estimateCStreamSize_usingCCtxParams
|
||||
{
|
||||
ZSTD_CCtx_params* params = ZSTD_createCCtxParams();
|
||||
size_t const cctxSizeDefault = ZSTD_estimateCStreamSize_usingCCtxParams(params);
|
||||
staticCCtx = ZSTD_initStaticCCtx(staticCCtxBuffer, cctxSizeDefault);
|
||||
CHECK_VAR(cSize, ZSTD_compressCCtx(staticCCtx,
|
||||
compressedBuffer, compressedBufferSize,
|
||||
CNBuffer, CNBuffSize, 3) );
|
||||
|
||||
{
|
||||
size_t const r = ZSTD_decompressDCtx(staticDCtx,
|
||||
decodedBuffer, CNBuffSize,
|
||||
compressedBuffer, cSize);
|
||||
if (r != CNBuffSize) goto _output_error;
|
||||
if (memcmp(decodedBuffer, CNBuffer, CNBuffSize)) goto _output_error;
|
||||
}
|
||||
ZSTD_freeCCtxParams(params);
|
||||
}
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : test estimation functions with maxBlockSize = 0 : ", testNb++);
|
||||
{
|
||||
// Test ZSTD_estimateCCtxSize_usingCCtxParams
|
||||
{
|
||||
ZSTD_CCtx_params* params = ZSTD_createCCtxParams();
|
||||
size_t cctxSizeDefault;
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(params, ZSTD_c_maxBlockSize, 0));
|
||||
cctxSizeDefault = ZSTD_estimateCCtxSize_usingCCtxParams(params);
|
||||
staticCCtx = ZSTD_initStaticCCtx(staticCCtxBuffer, cctxSizeDefault);
|
||||
CHECK_VAR(cSize, ZSTD_compressCCtx(staticCCtx,
|
||||
compressedBuffer, compressedBufferSize,
|
||||
CNBuffer, CNBuffSize, 3) );
|
||||
|
||||
{
|
||||
size_t const r = ZSTD_decompressDCtx(staticDCtx,
|
||||
decodedBuffer, CNBuffSize,
|
||||
compressedBuffer, cSize);
|
||||
if (r != CNBuffSize) goto _output_error;
|
||||
if (memcmp(decodedBuffer, CNBuffer, CNBuffSize)) goto _output_error;
|
||||
}
|
||||
ZSTD_freeCCtxParams(params);
|
||||
}
|
||||
|
||||
// Test ZSTD_estimateCStreamSize_usingCCtxParams
|
||||
{
|
||||
ZSTD_CCtx_params* params = ZSTD_createCCtxParams();
|
||||
size_t cctxSizeDefault;
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(params, ZSTD_c_maxBlockSize, 0));
|
||||
cctxSizeDefault = ZSTD_estimateCStreamSize_usingCCtxParams(params);
|
||||
staticCCtx = ZSTD_initStaticCCtx(staticCCtxBuffer, cctxSizeDefault);
|
||||
CHECK_VAR(cSize, ZSTD_compressCCtx(staticCCtx,
|
||||
compressedBuffer, compressedBufferSize,
|
||||
CNBuffer, CNBuffSize, 3) );
|
||||
|
||||
{
|
||||
size_t const r = ZSTD_decompressDCtx(staticDCtx,
|
||||
decodedBuffer, CNBuffSize,
|
||||
compressedBuffer, cSize);
|
||||
if (r != CNBuffSize) goto _output_error;
|
||||
if (memcmp(decodedBuffer, CNBuffer, CNBuffSize)) goto _output_error;
|
||||
}
|
||||
ZSTD_freeCCtxParams(params);
|
||||
}
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
}
|
||||
free(staticCCtxBuffer);
|
||||
free(staticDCtxBuffer);
|
||||
@@ -1647,8 +1904,8 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
testResult = 1;
|
||||
goto _end;
|
||||
}
|
||||
CHECK( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_nbWorkers, 2) );
|
||||
CHECK( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_compressionLevel, 1) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_nbWorkers, 2) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_compressionLevel, 1) );
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3u : compress %u bytes with 2 threads : ", testNb++, (unsigned)CNBuffSize);
|
||||
@@ -1678,9 +1935,9 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : compress -T2 with checksum : ", testNb++);
|
||||
CHECK( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_checksumFlag, 1) );
|
||||
CHECK( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_contentSizeFlag, 1) );
|
||||
CHECK( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_overlapLog, 3) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_checksumFlag, 1) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_contentSizeFlag, 1) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(mtctx, ZSTD_c_overlapLog, 3) );
|
||||
CHECK_VAR(cSize, ZSTD_compress2(mtctx,
|
||||
compressedBuffer, compressedBufferSize,
|
||||
CNBuffer, CNBuffSize) );
|
||||
@@ -1699,11 +1956,11 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
ZSTD_DCtx* const dctx = ZSTD_createDCtx();
|
||||
char out[32];
|
||||
if (cctx == NULL || dctx == NULL) goto _output_error;
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_contentSizeFlag, 0) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_contentSizeFlag, 0) );
|
||||
CHECK_VAR(cSize, ZSTD_compress2(cctx, out, sizeof(out), NULL, 0) );
|
||||
DISPLAYLEVEL(3, "OK (%u bytes)\n", (unsigned)cSize);
|
||||
|
||||
CHECK( ZSTD_DCtx_setParameter(dctx, ZSTD_d_windowLogMax, 10) );
|
||||
CHECK_Z( ZSTD_DCtx_setParameter(dctx, ZSTD_d_windowLogMax, 10) );
|
||||
{ char const* outPtr = out;
|
||||
ZSTD_inBuffer inBuffer = { outPtr, cSize, 0 };
|
||||
ZSTD_outBuffer outBuffer = { NULL, 0, 0 };
|
||||
@@ -1718,9 +1975,9 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : compress with block splitting : ", testNb++)
|
||||
{ ZSTD_CCtx* cctx = ZSTD_createCCtx();
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_useBlockSplitter, ZSTD_ps_enable) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_useBlockSplitter, ZSTD_ps_enable) );
|
||||
cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize);
|
||||
CHECK(cSize);
|
||||
CHECK_Z(cSize);
|
||||
ZSTD_freeCCtx(cctx);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
@@ -1728,13 +1985,13 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
DISPLAYLEVEL(3, "test%3i : compress -T2 with/without literals compression : ", testNb++)
|
||||
{ ZSTD_CCtx* cctx = ZSTD_createCCtx();
|
||||
size_t cSize1, cSize2;
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 1) );
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 2) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 1) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 2) );
|
||||
cSize1 = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize);
|
||||
CHECK(cSize1);
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_literalCompressionMode, ZSTD_ps_disable) );
|
||||
CHECK_Z(cSize1);
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_literalCompressionMode, ZSTD_ps_disable) );
|
||||
cSize2 = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize);
|
||||
CHECK(cSize2);
|
||||
CHECK_Z(cSize2);
|
||||
CHECK_LT(cSize1, cSize2);
|
||||
ZSTD_freeCCtx(cctx);
|
||||
}
|
||||
@@ -1745,10 +2002,10 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
/* Set rsyncable and don't give the ZSTD_compressBound(CNBuffSize) so
|
||||
* ZSTDMT is forced to not take the shortcut.
|
||||
*/
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 1) );
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 1) );
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_rsyncable, 1) );
|
||||
CHECK( ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize - 1, CNBuffer, CNBuffSize) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 1) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 1) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_rsyncable, 1) );
|
||||
CHECK_Z( ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize - 1, CNBuffer, CNBuffSize) );
|
||||
ZSTD_freeCCtx(cctx);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
@@ -1758,22 +2015,22 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
int const jobSize = 512 KB;
|
||||
int value;
|
||||
/* Check that the overlap log and job size are unset. */
|
||||
CHECK( ZSTD_CCtxParams_getParameter(params, ZSTD_c_overlapLog, &value) );
|
||||
CHECK_Z( ZSTD_CCtxParams_getParameter(params, ZSTD_c_overlapLog, &value) );
|
||||
CHECK_EQ(value, 0);
|
||||
CHECK( ZSTD_CCtxParams_getParameter(params, ZSTD_c_jobSize, &value) );
|
||||
CHECK_Z( ZSTD_CCtxParams_getParameter(params, ZSTD_c_jobSize, &value) );
|
||||
CHECK_EQ(value, 0);
|
||||
/* Set and check the overlap log and job size. */
|
||||
CHECK( ZSTD_CCtxParams_setParameter(params, ZSTD_c_overlapLog, 5) );
|
||||
CHECK( ZSTD_CCtxParams_setParameter(params, ZSTD_c_jobSize, jobSize) );
|
||||
CHECK( ZSTD_CCtxParams_getParameter(params, ZSTD_c_overlapLog, &value) );
|
||||
CHECK_Z( ZSTD_CCtxParams_setParameter(params, ZSTD_c_overlapLog, 5) );
|
||||
CHECK_Z( ZSTD_CCtxParams_setParameter(params, ZSTD_c_jobSize, jobSize) );
|
||||
CHECK_Z( ZSTD_CCtxParams_getParameter(params, ZSTD_c_overlapLog, &value) );
|
||||
CHECK_EQ(value, 5);
|
||||
CHECK( ZSTD_CCtxParams_getParameter(params, ZSTD_c_jobSize, &value) );
|
||||
CHECK_Z( ZSTD_CCtxParams_getParameter(params, ZSTD_c_jobSize, &value) );
|
||||
CHECK_EQ(value, jobSize);
|
||||
/* Set the number of workers and check the overlap log and job size. */
|
||||
CHECK( ZSTD_CCtxParams_setParameter(params, ZSTD_c_nbWorkers, 2) );
|
||||
CHECK( ZSTD_CCtxParams_getParameter(params, ZSTD_c_overlapLog, &value) );
|
||||
CHECK_Z( ZSTD_CCtxParams_setParameter(params, ZSTD_c_nbWorkers, 2) );
|
||||
CHECK_Z( ZSTD_CCtxParams_getParameter(params, ZSTD_c_overlapLog, &value) );
|
||||
CHECK_EQ(value, 5);
|
||||
CHECK( ZSTD_CCtxParams_getParameter(params, ZSTD_c_jobSize, &value) );
|
||||
CHECK_Z( ZSTD_CCtxParams_getParameter(params, ZSTD_c_jobSize, &value) );
|
||||
CHECK_EQ(value, jobSize);
|
||||
ZSTD_freeCCtxParams(params);
|
||||
}
|
||||
@@ -1884,8 +2141,8 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : load dictionary into context : ", testNb++);
|
||||
CHECK( ZSTD_compressBegin_usingDict(ctxOrig, CNBuffer, dictSize, 2) );
|
||||
CHECK( ZSTD_copyCCtx(ctxDuplicated, ctxOrig, 0) ); /* Begin_usingDict implies unknown srcSize, so match that */
|
||||
CHECK_Z( ZSTD_compressBegin_usingDict(ctxOrig, CNBuffer, dictSize, 2) );
|
||||
CHECK_Z( ZSTD_copyCCtx(ctxDuplicated, ctxOrig, 0) ); /* Begin_usingDict implies unknown srcSize, so match that */
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : compress with flat dictionary : ", testNb++);
|
||||
@@ -1945,8 +2202,8 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : check content size on duplicated context : ", testNb++);
|
||||
{ size_t const testSize = CNBuffSize / 3;
|
||||
CHECK( ZSTD_compressBegin(ctxOrig, ZSTD_defaultCLevel()) );
|
||||
CHECK( ZSTD_copyCCtx(ctxDuplicated, ctxOrig, testSize) );
|
||||
CHECK_Z( ZSTD_compressBegin(ctxOrig, ZSTD_defaultCLevel()) );
|
||||
CHECK_Z( ZSTD_copyCCtx(ctxDuplicated, ctxOrig, testSize) );
|
||||
|
||||
CHECK_VAR(cSize, ZSTD_compressEnd(ctxDuplicated, compressedBuffer, ZSTD_compressBound(testSize),
|
||||
(const char*)CNBuffer + dictSize, testSize) );
|
||||
@@ -2346,6 +2603,27 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3d : bufferless api with cdict : ", testNb++);
|
||||
{ ZSTD_CDict* const cdict = ZSTD_createCDict(dictBuffer, dictSize, 1);
|
||||
ZSTD_DCtx* const dctx = ZSTD_createDCtx();
|
||||
ZSTD_frameParameters const fParams = { 0, 1, 0 };
|
||||
size_t cBlockSize;
|
||||
cSize = 0;
|
||||
CHECK_Z(ZSTD_compressBegin_usingCDict_advanced(cctx, cdict, fParams, ZSTD_CONTENTSIZE_UNKNOWN));
|
||||
cBlockSize = ZSTD_compressContinue(cctx, (char*)compressedBuffer + cSize, compressedBufferSize - cSize, CNBuffer, 1000);
|
||||
CHECK_Z(cBlockSize);
|
||||
cSize += cBlockSize;
|
||||
cBlockSize = ZSTD_compressEnd(cctx, (char*)compressedBuffer + cSize, compressedBufferSize - cSize, (char const*)CNBuffer + 2000, 1000);
|
||||
CHECK_Z(cBlockSize);
|
||||
cSize += cBlockSize;
|
||||
|
||||
CHECK_Z(ZSTD_decompress_usingDict(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize, dictBuffer, dictSize));
|
||||
|
||||
ZSTD_freeCDict(cdict);
|
||||
ZSTD_freeDCtx(dctx);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : Building cdict w/ ZSTD_dct_fullDict on a good dictionary : ", testNb++);
|
||||
{ ZSTD_compressionParameters const cParams = ZSTD_getCParams(1, CNBuffSize, dictSize);
|
||||
ZSTD_CDict* const cdict = ZSTD_createCDict_advanced(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_fullDict, cParams, ZSTD_defaultCMem);
|
||||
@@ -2586,6 +2864,90 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : ZSTD_fast attach dictionary with hashLog = 25 and chainLog = 25 : ", testNb++);
|
||||
{
|
||||
ZSTD_CCtx_params* cctxParams = ZSTD_createCCtxParams();
|
||||
ZSTD_customMem customMem = {NULL, NULL, NULL};
|
||||
ZSTD_DCtx* dctx = ZSTD_createDCtx();
|
||||
ZSTD_CDict* cdict;
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_strategy, ZSTD_fast));
|
||||
/* Set windowLog to 25 so hash/chain logs don't get sized down */
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_windowLog, 25));
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_hashLog, 25));
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_chainLog, 25));
|
||||
/* Set srcSizeHint to 2^25 so hash/chain logs don't get sized down */
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_srcSizeHint, 1u << 25));
|
||||
cdict = ZSTD_createCDict_advanced2(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto, cctxParams, customMem);
|
||||
CHECK_Z(ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_forceAttachDict, ZSTD_dictForceAttach));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1));
|
||||
CHECK_Z(ZSTD_CCtx_refCDict(cctx, cdict));
|
||||
cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize);
|
||||
CHECK_Z(cSize);
|
||||
CHECK_Z(ZSTD_decompress_usingDict(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize, dictBuffer, dictSize));
|
||||
ZSTD_freeCDict(cdict);
|
||||
ZSTD_freeDCtx(dctx);
|
||||
ZSTD_freeCCtxParams(cctxParams);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : ZSTD_dfast attach dictionary with hashLog = 25 and chainLog = 25 : ", testNb++);
|
||||
{
|
||||
ZSTD_CCtx_params* cctxParams = ZSTD_createCCtxParams();
|
||||
ZSTD_customMem customMem = {NULL, NULL, NULL};
|
||||
ZSTD_DCtx* dctx = ZSTD_createDCtx();
|
||||
ZSTD_CDict* cdict;
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_strategy, ZSTD_dfast));
|
||||
/* Set windowLog to 25 so hash/chain logs don't get sized down */
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_windowLog, 25));
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_hashLog, 25));
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_chainLog, 25));
|
||||
/* Set srcSizeHint to 2^25 so hash/chain logs don't get sized down */
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_srcSizeHint, 1u << 25));
|
||||
cdict = ZSTD_createCDict_advanced2(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto, cctxParams, customMem);
|
||||
CHECK_Z(ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_forceAttachDict, ZSTD_dictForceAttach));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1));
|
||||
CHECK_Z(ZSTD_CCtx_refCDict(cctx, cdict));
|
||||
cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize);
|
||||
CHECK_Z(cSize);
|
||||
CHECK_Z(ZSTD_decompress_usingDict(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize, dictBuffer, dictSize));
|
||||
ZSTD_freeCDict(cdict);
|
||||
ZSTD_freeDCtx(dctx);
|
||||
ZSTD_freeCCtxParams(cctxParams);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : ZSTD_lazy attach dictionary with hashLog = 29 and searchLog = 4 : ", testNb++);
|
||||
if (MEM_64bits()) {
|
||||
ZSTD_CCtx_params* cctxParams = ZSTD_createCCtxParams();
|
||||
ZSTD_customMem customMem = {NULL, NULL, NULL};
|
||||
ZSTD_DCtx* dctx = ZSTD_createDCtx();
|
||||
ZSTD_CDict* cdict;
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_strategy, ZSTD_lazy));
|
||||
/* Force enable row based match finder, and disable dedicated dict search. */
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_useRowMatchFinder, ZSTD_ps_enable));
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_enableDedicatedDictSearch, 0));
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_searchLog, 4));
|
||||
/* Set windowLog to 29 so hash/chain logs don't get sized down */
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_windowLog, 29));
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_hashLog, 29));
|
||||
/* Set srcSizeHint to 2^29 so hash/chain logs don't get sized down */
|
||||
CHECK_Z(ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_srcSizeHint, 1u << 29));
|
||||
cdict = ZSTD_createCDict_advanced2(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto, cctxParams, customMem);
|
||||
CHECK_Z(ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_forceAttachDict, ZSTD_dictForceAttach));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1));
|
||||
CHECK_Z(ZSTD_CCtx_refCDict(cctx, cdict));
|
||||
cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, CNBuffSize);
|
||||
CHECK_Z(cSize);
|
||||
CHECK_Z(ZSTD_decompress_usingDict(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize, dictBuffer, dictSize));
|
||||
ZSTD_freeCDict(cdict);
|
||||
ZSTD_freeDCtx(dctx);
|
||||
ZSTD_freeCCtxParams(cctxParams);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : Dictionary with non-default repcodes : ", testNb++);
|
||||
{ U32 u; for (u=0; u<nbSamples; u++) samplesSizes[u] = sampleUnitSize; }
|
||||
dictSize = ZDICT_trainFromBuffer(dictBuffer, dictSize,
|
||||
@@ -2780,7 +3142,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
size_t const wrongSrcSize = (srcSize + 1000);
|
||||
ZSTD_parameters params = ZSTD_getParams(1, wrongSrcSize, 0);
|
||||
params.fParams.contentSizeFlag = 1;
|
||||
CHECK( ZSTD_compressBegin_advanced(cctx, NULL, 0, params, wrongSrcSize) );
|
||||
CHECK_Z( ZSTD_compressBegin_advanced(cctx, NULL, 0, params, wrongSrcSize) );
|
||||
{ size_t const result = ZSTD_compressEnd(cctx, decodedBuffer, CNBuffSize, CNBuffer, srcSize);
|
||||
if (!ZSTD_isError(result)) goto _output_error;
|
||||
if (ZSTD_getErrorCode(result) != ZSTD_error_srcSize_wrong) goto _output_error;
|
||||
@@ -2800,7 +3162,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
CNBuffer, srcSize, compressionLevel);
|
||||
if (ZSTD_isError(cSize_1pass)) goto _output_error;
|
||||
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, compressionLevel) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, compressionLevel) );
|
||||
{ size_t const compressionResult = ZSTD_compress2(cctx,
|
||||
compressedBuffer, compressedBufferSize,
|
||||
CNBuffer, srcSize);
|
||||
@@ -2819,13 +3181,13 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
{ ZSTD_CCtx* const cctx = ZSTD_createCCtx();
|
||||
DISPLAYLEVEL(3, "test%3i : parameters in order : ", testNb++);
|
||||
assert(cctx != NULL);
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 2) );
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_enable) );
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, 18) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 2) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_enable) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, 18) );
|
||||
{ size_t const compressedSize = ZSTD_compress2(cctx,
|
||||
compressedBuffer, ZSTD_compressBound(inputSize),
|
||||
CNBuffer, inputSize);
|
||||
CHECK(compressedSize);
|
||||
CHECK_Z(compressedSize);
|
||||
cSize = compressedSize;
|
||||
xxh64 = XXH64(compressedBuffer, compressedSize, 0);
|
||||
}
|
||||
@@ -2835,13 +3197,13 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
|
||||
{ ZSTD_CCtx* cctx = ZSTD_createCCtx();
|
||||
DISPLAYLEVEL(3, "test%3i : parameters disordered : ", testNb++);
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, 18) );
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_enable) );
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 2) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, 18) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_enable) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 2) );
|
||||
{ size_t const result = ZSTD_compress2(cctx,
|
||||
compressedBuffer, ZSTD_compressBound(inputSize),
|
||||
CNBuffer, inputSize);
|
||||
CHECK(result);
|
||||
CHECK_Z(result);
|
||||
if (result != cSize) goto _output_error; /* must result in same compressed result, hence same size */
|
||||
if (XXH64(compressedBuffer, result, 0) != xxh64) goto _output_error; /* must result in exactly same content, hence same hash */
|
||||
DISPLAYLEVEL(3, "OK (compress : %u -> %u bytes)\n", (unsigned)inputSize, (unsigned)result);
|
||||
@@ -2856,7 +3218,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : get dParameter bounds ", testNb++);
|
||||
{ ZSTD_bounds const bounds = ZSTD_dParam_getBounds(ZSTD_d_windowLogMax);
|
||||
CHECK(bounds.error);
|
||||
CHECK_Z(bounds.error);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
@@ -2890,7 +3252,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
|
||||
/* basic block compression */
|
||||
DISPLAYLEVEL(3, "test%3i : magic-less format test : ", testNb++);
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_format, ZSTD_f_zstd1_magicless) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_format, ZSTD_f_zstd1_magicless) );
|
||||
{ ZSTD_inBuffer in = { CNBuffer, inputSize, 0 };
|
||||
ZSTD_outBuffer out = { compressedBuffer, ZSTD_compressBound(inputSize), 0 };
|
||||
size_t const result = ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_end);
|
||||
@@ -2908,7 +3270,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : decompress of magic-less frame : ", testNb++);
|
||||
ZSTD_DCtx_reset(dctx, ZSTD_reset_session_and_parameters);
|
||||
CHECK( ZSTD_DCtx_setParameter(dctx, ZSTD_d_format, ZSTD_f_zstd1_magicless) );
|
||||
CHECK_Z( ZSTD_DCtx_setParameter(dctx, ZSTD_d_format, ZSTD_f_zstd1_magicless) );
|
||||
{ ZSTD_frameHeader zfh;
|
||||
size_t const zfhrt = ZSTD_getFrameHeader_advanced(&zfh, compressedBuffer, cSize, ZSTD_f_zstd1_magicless);
|
||||
if (zfhrt != 0) goto _output_error;
|
||||
@@ -2930,7 +3292,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
|
||||
/* basic block compression */
|
||||
DISPLAYLEVEL(3, "test%3i : empty magic-less format test : ", testNb++);
|
||||
CHECK( ZSTD_CCtx_setParameter(cctx, ZSTD_c_format, ZSTD_f_zstd1_magicless) );
|
||||
CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_format, ZSTD_f_zstd1_magicless) );
|
||||
{ ZSTD_inBuffer in = { CNBuffer, 0, 0 };
|
||||
ZSTD_outBuffer out = { compressedBuffer, ZSTD_compressBound(0), 0 };
|
||||
size_t const result = ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_end);
|
||||
@@ -2942,7 +3304,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : decompress of empty magic-less frame : ", testNb++);
|
||||
ZSTD_DCtx_reset(dctx, ZSTD_reset_session_and_parameters);
|
||||
CHECK( ZSTD_DCtx_setParameter(dctx, ZSTD_d_format, ZSTD_f_zstd1_magicless) );
|
||||
CHECK_Z( ZSTD_DCtx_setParameter(dctx, ZSTD_d_format, ZSTD_f_zstd1_magicless) );
|
||||
/* one shot */
|
||||
{ size_t const result = ZSTD_decompressDCtx(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize);
|
||||
if (result != 0) goto _output_error;
|
||||
@@ -2977,13 +3339,13 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
int check;
|
||||
if (ZSTD_isError(bounds.error))
|
||||
continue;
|
||||
CHECK(ZSTD_DCtx_getParameter(dctx, dParam, &value1));
|
||||
CHECK_Z(ZSTD_DCtx_getParameter(dctx, dParam, &value1));
|
||||
value2 = (value1 != bounds.lowerBound) ? bounds.lowerBound : bounds.upperBound;
|
||||
CHECK(ZSTD_DCtx_setParameter(dctx, dParam, value2));
|
||||
CHECK(ZSTD_DCtx_getParameter(dctx, dParam, &check));
|
||||
CHECK_Z(ZSTD_DCtx_setParameter(dctx, dParam, value2));
|
||||
CHECK_Z(ZSTD_DCtx_getParameter(dctx, dParam, &check));
|
||||
if (check != value2) goto _output_error;
|
||||
CHECK(ZSTD_DCtx_reset(dctx, ZSTD_reset_parameters));
|
||||
CHECK(ZSTD_DCtx_getParameter(dctx, dParam, &check));
|
||||
CHECK_Z(ZSTD_DCtx_reset(dctx, ZSTD_reset_parameters));
|
||||
CHECK_Z(ZSTD_DCtx_getParameter(dctx, dParam, &check));
|
||||
if (check != value1) goto _output_error;
|
||||
}
|
||||
ZSTD_freeDCtx(dctx);
|
||||
@@ -3000,21 +3362,21 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
|
||||
/* basic block compression */
|
||||
DISPLAYLEVEL(3, "test%3i : Block compression test : ", testNb++);
|
||||
CHECK( ZSTD_compressBegin(cctx, 5) );
|
||||
CHECK( ZSTD_getBlockSize(cctx) >= blockSize);
|
||||
CHECK_Z( ZSTD_compressBegin(cctx, 5) );
|
||||
CHECK_Z( ZSTD_getBlockSize(cctx) >= blockSize);
|
||||
CHECK_VAR(cSize, ZSTD_compressBlock(cctx, compressedBuffer, ZSTD_compressBound(blockSize), CNBuffer, blockSize) );
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : Block decompression test : ", testNb++);
|
||||
CHECK( ZSTD_decompressBegin(dctx) );
|
||||
CHECK_Z( ZSTD_decompressBegin(dctx) );
|
||||
{ CHECK_NEWV(r, ZSTD_decompressBlock(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize) );
|
||||
if (r != blockSize) goto _output_error; }
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
/* very long stream of block compression */
|
||||
DISPLAYLEVEL(3, "test%3i : Huge block streaming compression test : ", testNb++);
|
||||
CHECK( ZSTD_compressBegin(cctx, -199) ); /* we just want to quickly overflow internal U32 index */
|
||||
CHECK( ZSTD_getBlockSize(cctx) >= blockSize);
|
||||
CHECK_Z( ZSTD_compressBegin(cctx, -199) ); /* we just want to quickly overflow internal U32 index */
|
||||
CHECK_Z( ZSTD_getBlockSize(cctx) >= blockSize);
|
||||
{ U64 const toCompress = 5000000000ULL; /* > 4 GB */
|
||||
U64 compressed = 0;
|
||||
while (compressed < toCompress) {
|
||||
@@ -3027,7 +3389,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
|
||||
/* dictionary block compression */
|
||||
DISPLAYLEVEL(3, "test%3i : Dictionary Block compression test : ", testNb++);
|
||||
CHECK( ZSTD_compressBegin_usingDict(cctx, CNBuffer, dictSize, 5) );
|
||||
CHECK_Z( ZSTD_compressBegin_usingDict(cctx, CNBuffer, dictSize, 5) );
|
||||
CHECK_VAR(cSize, ZSTD_compressBlock(cctx, compressedBuffer, ZSTD_compressBound(blockSize), (char*)CNBuffer+dictSize, blockSize));
|
||||
RDG_genBuffer((char*)CNBuffer+dictSize+blockSize, blockSize, 0.0, 0.0, seed); /* create a non-compressible second block */
|
||||
{ CHECK_NEWV(r, ZSTD_compressBlock(cctx, (char*)compressedBuffer+cSize, ZSTD_compressBound(blockSize), (char*)CNBuffer+dictSize+blockSize, blockSize) ); /* for cctx history consistency */
|
||||
@@ -3038,7 +3400,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : Dictionary Block decompression test : ", testNb++);
|
||||
CHECK( ZSTD_decompressBegin_usingDict(dctx, CNBuffer, dictSize) );
|
||||
CHECK_Z( ZSTD_decompressBegin_usingDict(dctx, CNBuffer, dictSize) );
|
||||
{ CHECK_NEWV( r, ZSTD_decompressBlock(dctx, decodedBuffer, blockSize, compressedBuffer, cSize) );
|
||||
if (r != blockSize) {
|
||||
DISPLAYLEVEL(1, "ZSTD_decompressBlock() with _usingDict() fails : %u, instead of %u expected \n", (unsigned)r, (unsigned)blockSize);
|
||||
@@ -3057,8 +3419,8 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
DISPLAYLEVEL(3, "test%3i : Block compression with CDict : ", testNb++);
|
||||
{ ZSTD_CDict* const cdict = ZSTD_createCDict(CNBuffer, dictSize, 3);
|
||||
if (cdict==NULL) goto _output_error;
|
||||
CHECK( ZSTD_compressBegin_usingCDict(cctx, cdict) );
|
||||
CHECK( ZSTD_compressBlock(cctx, compressedBuffer, ZSTD_compressBound(blockSize), (char*)CNBuffer+dictSize, blockSize) );
|
||||
CHECK_Z( ZSTD_compressBegin_usingCDict(cctx, cdict) );
|
||||
CHECK_Z( ZSTD_compressBlock(cctx, compressedBuffer, ZSTD_compressBound(blockSize), (char*)CNBuffer+dictSize, blockSize) );
|
||||
ZSTD_freeCDict(cdict);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
@@ -3227,7 +3589,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
size_t const bound = ZSTD_compressBound(_3BYTESTESTLENGTH);
|
||||
size_t nbSeq = 1;
|
||||
while (nbSeq <= maxNbSeq) {
|
||||
CHECK(ZSTD_compressCCtx(cctx, compressedBuffer, bound, CNBuffer, nbSeq * 3, 19));
|
||||
CHECK_Z(ZSTD_compressCCtx(cctx, compressedBuffer, bound, CNBuffer, nbSeq * 3, 19));
|
||||
/* Check every sequence for the first 100, then skip more rapidly. */
|
||||
if (nbSeq < 100) {
|
||||
++nbSeq;
|
||||
@@ -3256,7 +3618,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
size_t const bound = ZSTD_compressBound(CNBuffSize);
|
||||
size_t size = 1;
|
||||
while (size <= CNBuffSize) {
|
||||
CHECK(ZSTD_compressCCtx(cctx, compressedBuffer, bound, CNBuffer, size, 3));
|
||||
CHECK_Z(ZSTD_compressCCtx(cctx, compressedBuffer, bound, CNBuffer, size, 3));
|
||||
/* Check every size for the first 100, then skip more rapidly. */
|
||||
if (size < 100) {
|
||||
++size;
|
||||
@@ -3291,7 +3653,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
void* const outputBuffer = malloc(outputSize);
|
||||
ZSTD_CCtx* const cctx = ZSTD_createCCtx();
|
||||
if (!outputBuffer || !cctx) goto _output_error;
|
||||
CHECK(ZSTD_compress_usingDict(cctx, outputBuffer, outputSize, CNBuffer, inputSize, dictBuffer, dictSize, 1));
|
||||
CHECK_Z(ZSTD_compress_usingDict(cctx, outputBuffer, outputSize, CNBuffer, inputSize, dictBuffer, dictSize, 1));
|
||||
free(outputBuffer);
|
||||
ZSTD_freeCCtx(cctx);
|
||||
}
|
||||
@@ -3378,7 +3740,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : testing bitwise intrinsics PR#3045: ", testNb++);
|
||||
{
|
||||
U32 seed_copy = seed; // need non-const seed to avoid compiler warning for FUZ_rand(&seed)
|
||||
U32 seed_copy = seed; /* need non-const seed to avoid compiler warning for FUZ_rand(&seed) */
|
||||
U32 rand32 = FUZ_rand(&seed_copy);
|
||||
U64 rand64 = ((U64)FUZ_rand(&seed_copy) << 32) | FUZ_rand(&seed_copy);
|
||||
U32 lowbit_only_32 = 1;
|
||||
@@ -3386,8 +3748,8 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
||||
U32 highbit_only_32 = (U32)1 << 31;
|
||||
U64 highbit_only_64 = (U64)1 << 63;
|
||||
U32 i;
|
||||
if (rand32 == 0) rand32 = 1; // CLZ and CTZ are undefined on 0
|
||||
if (rand64 == 0) rand64 = 1; // CLZ and CTZ are undefined on 0
|
||||
if (rand32 == 0) rand32 = 1; /* CLZ and CTZ are undefined on 0 */
|
||||
if (rand64 == 0) rand64 = 1; /* CLZ and CTZ are undefined on 0 */
|
||||
|
||||
/* Test ZSTD_countTrailingZeros32 */
|
||||
CHECK_EQ(ZSTD_countTrailingZeros32(lowbit_only_32), 0u);
|
||||
@@ -3628,7 +3990,7 @@ static int longUnitTests(U32 const seed, double compressibility)
|
||||
while (approxIndex <= (maxIndex / 4) * 3) {
|
||||
CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_flush));
|
||||
approxIndex += in.pos;
|
||||
CHECK(in.pos == in.size);
|
||||
CHECK_Z(in.pos == in.size);
|
||||
in.pos = 0;
|
||||
out.pos = 0;
|
||||
}
|
||||
@@ -3654,7 +4016,7 @@ static int longUnitTests(U32 const seed, double compressibility)
|
||||
while (approxIndex <= maxIndex) {
|
||||
CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_flush));
|
||||
approxIndex += in.pos;
|
||||
CHECK(in.pos == in.size);
|
||||
CHECK_Z(in.pos == in.size);
|
||||
in.pos = 0;
|
||||
out.pos = 0;
|
||||
}
|
||||
@@ -3737,7 +4099,7 @@ static int longUnitTests(U32 const seed, double compressibility)
|
||||
RDG_genBuffer(dict, dictSize, 0.5, 0.5, seed);
|
||||
RDG_genBuffer(CNBuffer, CNBuffSize, 0.6, 0.6, seed);
|
||||
|
||||
CHECK(cctx_params != NULL);
|
||||
CHECK_Z(cctx_params != NULL);
|
||||
|
||||
for (dictSize = CNBuffSize; dictSize; dictSize = dictSize >> 3) {
|
||||
DISPLAYLEVEL(3, "\n Testing with dictSize %u ", (U32)dictSize);
|
||||
@@ -3780,11 +4142,6 @@ _end:
|
||||
free(compressedBuffer);
|
||||
free(decodedBuffer);
|
||||
return testResult;
|
||||
|
||||
_output_error:
|
||||
testResult = 1;
|
||||
DISPLAY("Error detected in Unit tests ! \n");
|
||||
goto _end;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
+1
-1
@@ -1,5 +1,5 @@
|
||||
# ################################################################
|
||||
# Copyright (c) Facebook, Inc.
|
||||
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# Ensure that $SHELL is set to *some* value and exported.
|
||||
# This is required for dircolors, which would fail e.g., when
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
+1
-1
@@ -13,7 +13,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# Using this file in a test
|
||||
# =========================
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
@@ -16,7 +16,7 @@ scriptversion=2016-01-11.22; # UTC
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# limit so don't run it by default.
|
||||
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ .
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
+18
-17
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -36,27 +36,27 @@ compress(ZSTD_CStream *ctx, ZSTD_outBuffer out, const void *data, size_t size)
|
||||
int main(int argc, const char** argv)
|
||||
{
|
||||
ZSTD_CStream* ctx;
|
||||
ZSTD_parameters params;
|
||||
size_t rc;
|
||||
unsigned windowLog;
|
||||
unsigned windowLog = 18;
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
/* Create stream */
|
||||
ctx = ZSTD_createCStream();
|
||||
ctx = ZSTD_createCCtx();
|
||||
if (!ctx) { return 1; }
|
||||
/* Set parameters */
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
params.cParams.windowLog = 18;
|
||||
params.cParams.chainLog = 13;
|
||||
params.cParams.hashLog = 14;
|
||||
params.cParams.searchLog = 1;
|
||||
params.cParams.minMatch = 7;
|
||||
params.cParams.targetLength = 16;
|
||||
params.cParams.strategy = ZSTD_fast;
|
||||
windowLog = params.cParams.windowLog;
|
||||
/* Initialize stream */
|
||||
rc = ZSTD_initCStream_advanced(ctx, NULL, 0, params, 0);
|
||||
if (ZSTD_isError(rc)) { return 2; }
|
||||
if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_windowLog, windowLog)))
|
||||
return 2;
|
||||
if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_chainLog, 13)))
|
||||
return 2;
|
||||
if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_hashLog, 14)))
|
||||
return 2;
|
||||
if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_searchLog, 1)))
|
||||
return 2;
|
||||
if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_minMatch, 7)))
|
||||
return 2;
|
||||
if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_targetLength, 16)))
|
||||
return 2;
|
||||
if (ZSTD_isError(ZSTD_CCtx_setParameter(ctx, ZSTD_c_strategy, ZSTD_fast)))
|
||||
return 2;
|
||||
{
|
||||
U64 compressed = 0;
|
||||
const U64 toCompress = ((U64)1) << 33;
|
||||
@@ -97,5 +97,6 @@ int main(int argc, const char** argv)
|
||||
free(srcBuffer);
|
||||
free(dstBuffer);
|
||||
}
|
||||
ZSTD_freeCCtx(ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+20
-20
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -566,10 +566,10 @@ resultScore(const BMK_benchResult_t res, const size_t srcSize, const constraint_
|
||||
double cs = 0., ds = 0., rt, cm = 0.;
|
||||
const double r1 = 1, r2 = 0.1, rtr = 0.5;
|
||||
double ret;
|
||||
if(target.cSpeed) { cs = res.cSpeed / (double)target.cSpeed; }
|
||||
if(target.dSpeed) { ds = res.dSpeed / (double)target.dSpeed; }
|
||||
if(target.cMem != (U32)-1) { cm = (double)target.cMem / res.cMem; }
|
||||
rt = ((double)srcSize / res.cSize);
|
||||
if(target.cSpeed) { cs = (double)res.cSpeed / (double)target.cSpeed; }
|
||||
if(target.dSpeed) { ds = (double)res.dSpeed / (double)target.dSpeed; }
|
||||
if(target.cMem != (U32)-1) { cm = (double)target.cMem / (double)res.cMem; }
|
||||
rt = ((double)srcSize / (double)res.cSize);
|
||||
|
||||
ret = (MIN(1, cs) + MIN(1, ds) + MIN(1, cm))*r1 + rt * rtr +
|
||||
(MAX(0, log(cs))+ MAX(0, log(ds))+ MAX(0, log(cm))) * r2;
|
||||
@@ -581,8 +581,8 @@ resultScore(const BMK_benchResult_t res, const size_t srcSize, const constraint_
|
||||
static double
|
||||
resultDistLvl(const BMK_benchResult_t result1, const BMK_benchResult_t lvlRes)
|
||||
{
|
||||
double normalizedCSpeedGain1 = ((double)result1.cSpeed / lvlRes.cSpeed) - 1;
|
||||
double normalizedRatioGain1 = ((double)lvlRes.cSize / result1.cSize) - 1;
|
||||
double normalizedCSpeedGain1 = ((double)result1.cSpeed / (double)lvlRes.cSpeed) - 1;
|
||||
double normalizedRatioGain1 = ((double)lvlRes.cSize / (double)result1.cSize) - 1;
|
||||
if(normalizedRatioGain1 < 0 || normalizedCSpeedGain1 < 0) {
|
||||
return 0.0;
|
||||
}
|
||||
@@ -854,7 +854,7 @@ BMK_displayOneResult(FILE* f, winnerInfo_t res, const size_t srcSize)
|
||||
}
|
||||
|
||||
{ double const ratio = res.result.cSize ?
|
||||
(double)srcSize / res.result.cSize : 0;
|
||||
(double)srcSize / (double)res.result.cSize : 0;
|
||||
double const cSpeedMBps = (double)res.result.cSpeed / MB_UNIT;
|
||||
double const dSpeedMBps = (double)res.result.dSpeed / MB_UNIT;
|
||||
|
||||
@@ -937,7 +937,7 @@ BMK_printWinnerOpt(FILE* f, const U32 cLevel, const BMK_benchResult_t result, co
|
||||
}
|
||||
fprintf(f, "================================\n");
|
||||
fprintf(f, "Level Bounds: R: > %.3f AND C: < %.1f MB/s \n\n",
|
||||
(double)srcSize / g_lvltarget.cSize, (double)g_lvltarget.cSpeed / MB_UNIT);
|
||||
(double)srcSize / (double)g_lvltarget.cSize, (double)g_lvltarget.cSpeed / MB_UNIT);
|
||||
|
||||
|
||||
fprintf(f, "Overall Winner: \n");
|
||||
@@ -977,7 +977,7 @@ BMK_print_cLevelEntry(FILE* f, const int cLevel,
|
||||
}
|
||||
/* print comment */
|
||||
{ double const ratio = result.cSize ?
|
||||
(double)srcSize / result.cSize : 0;
|
||||
(double)srcSize / (double)result.cSize : 0;
|
||||
double const cSpeedMBps = (double)result.cSpeed / MB_UNIT;
|
||||
double const dSpeedMBps = (double)result.dSpeed / MB_UNIT;
|
||||
|
||||
@@ -1726,19 +1726,19 @@ static int allBench(BMK_benchResult_t* resultPtr,
|
||||
|
||||
/* calculate uncertainty in compression / decompression runs */
|
||||
if (benchres.cSpeed) {
|
||||
U64 const loopDurationC = (((U64)buf.srcSize * TIMELOOP_NANOSEC) / benchres.cSpeed);
|
||||
double const loopDurationC = (double)(((U64)buf.srcSize * TIMELOOP_NANOSEC) / benchres.cSpeed);
|
||||
uncertaintyConstantC = ((loopDurationC + (double)(2 * g_clockGranularity))/loopDurationC);
|
||||
}
|
||||
|
||||
if (benchres.dSpeed) {
|
||||
U64 const loopDurationD = (((U64)buf.srcSize * TIMELOOP_NANOSEC) / benchres.dSpeed);
|
||||
double const loopDurationD = (double)(((U64)buf.srcSize * TIMELOOP_NANOSEC) / benchres.dSpeed);
|
||||
uncertaintyConstantD = ((loopDurationD + (double)(2 * g_clockGranularity))/loopDurationD);
|
||||
}
|
||||
|
||||
/* optimistic assumption of benchres */
|
||||
{ BMK_benchResult_t resultMax = benchres;
|
||||
resultMax.cSpeed = (unsigned long long)(resultMax.cSpeed * uncertaintyConstantC * VARIANCE);
|
||||
resultMax.dSpeed = (unsigned long long)(resultMax.dSpeed * uncertaintyConstantD * VARIANCE);
|
||||
resultMax.cSpeed = (unsigned long long)((double)resultMax.cSpeed * uncertaintyConstantC * VARIANCE);
|
||||
resultMax.dSpeed = (unsigned long long)((double)resultMax.dSpeed * uncertaintyConstantD * VARIANCE);
|
||||
|
||||
/* disregard infeasible results in feas mode */
|
||||
/* disregard if resultMax < winner in infeas mode */
|
||||
@@ -1850,8 +1850,8 @@ static int BMK_seed(winnerInfo_t* winners,
|
||||
|
||||
if ((double)testResult.cSize <= ((double)winners[cLevel].result.cSize * (1. + (0.02 / cLevel))) ) {
|
||||
/* Validate solution is "good enough" */
|
||||
double W_ratio = (double)buf.srcSize / testResult.cSize;
|
||||
double O_ratio = (double)buf.srcSize / winners[cLevel].result.cSize;
|
||||
double W_ratio = (double)buf.srcSize / (double)testResult.cSize;
|
||||
double O_ratio = (double)buf.srcSize / (double)winners[cLevel].result.cSize;
|
||||
double W_ratioNote = log (W_ratio);
|
||||
double O_ratioNote = log (O_ratio);
|
||||
size_t W_DMemUsed = (1 << params.vals[wlog_ind]) + (16 KB);
|
||||
@@ -1864,11 +1864,11 @@ static int BMK_seed(winnerInfo_t* winners,
|
||||
double W_CMemUsed_note = W_ratioNote * ( 50 + 13*cLevel) - log((double)W_CMemUsed);
|
||||
double O_CMemUsed_note = O_ratioNote * ( 50 + 13*cLevel) - log((double)O_CMemUsed);
|
||||
|
||||
double W_CSpeed_note = W_ratioNote * (double)( 30 + 10*cLevel) + log(testResult.cSpeed);
|
||||
double O_CSpeed_note = O_ratioNote * (double)( 30 + 10*cLevel) + log(winners[cLevel].result.cSpeed);
|
||||
double W_CSpeed_note = W_ratioNote * (double)( 30 + 10*cLevel) + log((double)testResult.cSpeed);
|
||||
double O_CSpeed_note = O_ratioNote * (double)( 30 + 10*cLevel) + log((double)winners[cLevel].result.cSpeed);
|
||||
|
||||
double W_DSpeed_note = W_ratioNote * (double)( 20 + 2*cLevel) + log(testResult.dSpeed);
|
||||
double O_DSpeed_note = O_ratioNote * (double)( 20 + 2*cLevel) + log(winners[cLevel].result.dSpeed);
|
||||
double W_DSpeed_note = W_ratioNote * (double)( 20 + 2*cLevel) + log((double)testResult.dSpeed);
|
||||
double O_DSpeed_note = O_ratioNote * (double)( 20 + 2*cLevel) + log((double)winners[cLevel].result.dSpeed);
|
||||
|
||||
if (W_DMemUsed_note < O_DMemUsed_note) {
|
||||
/* uses too much Decompression memory for too little benefit */
|
||||
|
||||
+45
-22
@@ -387,7 +387,29 @@ println "\n===> file removal"
|
||||
zstd -f --rm tmp
|
||||
test ! -f tmp # tmp should no longer be present
|
||||
zstd -f -d --rm tmp.zst
|
||||
test ! -f tmp.zst # tmp.zst should no longer be present
|
||||
test ! -f tmp.zst # tmp.zst should no longer be present
|
||||
println "test: --rm is disabled when output is stdout"
|
||||
test -f tmp
|
||||
zstd --rm tmp -c > $INTOVOID
|
||||
test -f tmp # tmp shall still be there
|
||||
zstd -f --rm tmp -c > $INTOVOID
|
||||
test -f tmp # tmp shall still be there
|
||||
zstd -f tmp -c > $INTOVOID --rm
|
||||
test -f tmp # tmp shall still be there
|
||||
println "test: --rm is disabled when multiple inputs are concatenated into a single output"
|
||||
cp tmp tmp2
|
||||
zstd --rm tmp tmp2 -c > $INTOVOID
|
||||
test -f tmp
|
||||
test -f tmp2
|
||||
rm -f tmp3.zst
|
||||
echo 'y' | zstd -v tmp tmp2 -o tmp3.zst --rm # prompt for confirmation
|
||||
test -f tmp
|
||||
test -f tmp2
|
||||
zstd -f tmp tmp2 -o tmp3.zst --rm # just warns, no prompt
|
||||
test -f tmp
|
||||
test -f tmp2
|
||||
zstd -q tmp tmp2 -o tmp3.zst --rm && die "should refuse to concatenate"
|
||||
|
||||
println "test : should quietly not remove non-regular file"
|
||||
println hello > tmp
|
||||
zstd tmp -f -o "$DEVDEVICE" 2>tmplog > "$INTOVOID"
|
||||
@@ -429,36 +451,35 @@ println hello > tmp1
|
||||
println world > tmp2
|
||||
zstd tmp1 tmp2 -o "$INTOVOID" -f
|
||||
zstd tmp1 tmp2 -c | zstd -t
|
||||
zstd tmp1 tmp2 -o tmp.zst
|
||||
echo 'y' | zstd -v tmp1 tmp2 -o tmp.zst
|
||||
test ! -f tmp1.zst
|
||||
test ! -f tmp2.zst
|
||||
zstd tmp1 tmp2
|
||||
zstd -t tmp1.zst tmp2.zst
|
||||
zstd -dc tmp1.zst tmp2.zst
|
||||
zstd tmp1.zst tmp2.zst -o "$INTOVOID" -f
|
||||
zstd -d tmp1.zst tmp2.zst -o tmp
|
||||
echo 'y' | zstd -v -d tmp1.zst tmp2.zst -o tmp
|
||||
touch tmpexists
|
||||
zstd tmp1 tmp2 -f -o tmpexists
|
||||
zstd tmp1 tmp2 -q -o tmpexists && die "should have refused to overwrite"
|
||||
println gooder > tmp_rm1
|
||||
println boi > tmp_rm2
|
||||
println worldly > tmp_rm3
|
||||
echo 'y' | zstd tmp_rm1 tmp_rm2 -v -o tmp_rm3.zst --rm # tests the warning prompt for --rm with multiple inputs into once source
|
||||
test ! -f tmp_rm1
|
||||
test ! -f tmp_rm2
|
||||
echo 'y' | zstd -v tmp_rm1 tmp_rm2 -v -o tmp_rm3.zst
|
||||
test -f tmp_rm1
|
||||
test -f tmp_rm2
|
||||
cp tmp_rm3.zst tmp_rm4.zst
|
||||
echo 'Y' | zstd -d tmp_rm3.zst tmp_rm4.zst -v -o tmp_rm_out --rm
|
||||
test ! -f tmp_rm3.zst
|
||||
test ! -f tmp_rm4.zst
|
||||
echo 'yes' | zstd tmp_rm_out tmp_rm3 -c --rm && die "compressing multiple files to stdout with --rm should fail unless -f is specified"
|
||||
echo 'yes' | zstd tmp_rm_out tmp_rm3 -c --rm -v && die "compressing multiple files to stdout with --rm should fail unless -f is specified"
|
||||
echo 'Y' | zstd -v -d tmp_rm3.zst tmp_rm4.zst -v -o tmp_rm_out --rm
|
||||
test -f tmp_rm3.zst
|
||||
test -f tmp_rm4.zst
|
||||
println gooder > tmpexists1
|
||||
zstd tmpexists1 tmpexists -c --rm -f > $INTOVOID
|
||||
|
||||
# Bug: PR #972
|
||||
if [ "$?" -eq 139 ]; then
|
||||
die "should not have segfaulted"
|
||||
fi
|
||||
test -f tmpexists1
|
||||
test -f tmpexists
|
||||
println "\n===> multiple files and shell completion "
|
||||
datagen -s1 > tmp1 2> $INTOVOID
|
||||
datagen -s2 -g100K > tmp2 2> $INTOVOID
|
||||
@@ -562,19 +583,9 @@ if [ "$isWindows" = false ] ; then
|
||||
zstd -f -d tmp1.zst -o tmp1.out
|
||||
assertFilePermissions tmp1.out 400
|
||||
|
||||
rm -f tmp1.zst tmp1.out
|
||||
|
||||
umask 0666
|
||||
chmod 0666 tmp1 tmp2
|
||||
|
||||
println "test : respect umask when copying permissions in file -> file compression "
|
||||
zstd -f tmp1 -o tmp1.zst
|
||||
assertFilePermissions tmp1.zst 0
|
||||
println "test : respect umask when copying permissions in file -> file decompression "
|
||||
chmod 0666 tmp1.zst
|
||||
zstd -f -d tmp1.zst -o tmp1.out
|
||||
assertFilePermissions tmp1.out 0
|
||||
|
||||
rm -f tmp1.zst tmp1.out
|
||||
|
||||
println "test : respect umask when compressing from stdin input "
|
||||
@@ -1176,6 +1187,10 @@ zstd -t tmp3 && die "bad file not detected !" # detects 0-sized files as bad
|
||||
println "test --rm and --test combined "
|
||||
zstd -t --rm tmp1.zst
|
||||
test -f tmp1.zst # check file is still present
|
||||
cp tmp1.zst tmp2.zst
|
||||
zstd -t tmp1.zst tmp2.zst --rm
|
||||
test -f tmp1.zst # check file is still present
|
||||
test -f tmp2.zst # check file is still present
|
||||
split -b16384 tmp1.zst tmpSplit.
|
||||
zstd -t tmpSplit.* && die "bad file not detected !"
|
||||
datagen | zstd -c | zstd -t
|
||||
@@ -1202,7 +1217,15 @@ zstd -rqi0b1e2 tmp1
|
||||
println "benchmark decompression only"
|
||||
zstd -f tmp1
|
||||
zstd -b -d -i0 tmp1.zst
|
||||
println "benchmark can fail - decompression on invalid data"
|
||||
zstd -b -d -i0 tmp1 && die "invalid .zst data => benchmark should have failed"
|
||||
|
||||
GZIPMODE=1
|
||||
zstd --format=gzip -V || GZIPMODE=0
|
||||
if [ $GZIPMODE -eq 1 ]; then
|
||||
println "benchmark mode is only compatible with zstd"
|
||||
zstd --format=gzip -b tmp1 && die "-b should be incompatible with gzip format!"
|
||||
fi
|
||||
|
||||
println "\n===> zstd compatibility tests "
|
||||
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# ################################################################
|
||||
# Copyright (c) Facebook, Inc.
|
||||
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# ################################################################
|
||||
# Copyright (c) Facebook, Inc.
|
||||
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -11,10 +11,10 @@ silesia.tar, level 6, compress
|
||||
silesia.tar, level 7, compress simple, 4576661
|
||||
silesia.tar, level 9, compress simple, 4552899
|
||||
silesia.tar, level 13, compress simple, 4502956
|
||||
silesia.tar, level 16, compress simple, 4360527
|
||||
silesia.tar, level 19, compress simple, 4266970
|
||||
silesia.tar, level 16, compress simple, 4360546
|
||||
silesia.tar, level 19, compress simple, 4265911
|
||||
silesia.tar, uncompressed literals, compress simple, 4854086
|
||||
silesia.tar, uncompressed literals optimal, compress simple, 4266970
|
||||
silesia.tar, uncompressed literals optimal, compress simple, 4265911
|
||||
silesia.tar, huffman literals, compress simple, 6179047
|
||||
github.tar, level -5, compress simple, 52115
|
||||
github.tar, level -3, compress simple, 45678
|
||||
@@ -28,10 +28,10 @@ github.tar, level 6, compress
|
||||
github.tar, level 7, compress simple, 38110
|
||||
github.tar, level 9, compress simple, 36760
|
||||
github.tar, level 13, compress simple, 35501
|
||||
github.tar, level 16, compress simple, 40471
|
||||
github.tar, level 19, compress simple, 32149
|
||||
github.tar, level 16, compress simple, 40466
|
||||
github.tar, level 19, compress simple, 32276
|
||||
github.tar, uncompressed literals, compress simple, 38831
|
||||
github.tar, uncompressed literals optimal, compress simple, 32149
|
||||
github.tar, uncompressed literals optimal, compress simple, 32276
|
||||
github.tar, huffman literals, compress simple, 42560
|
||||
silesia, level -5, compress cctx, 6857372
|
||||
silesia, level -3, compress cctx, 6503412
|
||||
@@ -45,8 +45,8 @@ silesia, level 6, compress
|
||||
silesia, level 7, compress cctx, 4566984
|
||||
silesia, level 9, compress cctx, 4543018
|
||||
silesia, level 13, compress cctx, 4493990
|
||||
silesia, level 16, compress cctx, 4359864
|
||||
silesia, level 19, compress cctx, 4296438
|
||||
silesia, level 16, compress cctx, 4360041
|
||||
silesia, level 19, compress cctx, 4296055
|
||||
silesia, long distance mode, compress cctx, 4842075
|
||||
silesia, multithreaded, compress cctx, 4842075
|
||||
silesia, multithreaded long distance mode, compress cctx, 4842075
|
||||
@@ -55,7 +55,7 @@ silesia, small hash log, compress
|
||||
silesia, small chain log, compress cctx, 4912197
|
||||
silesia, explicit params, compress cctx, 4794052
|
||||
silesia, uncompressed literals, compress cctx, 4842075
|
||||
silesia, uncompressed literals optimal, compress cctx, 4296438
|
||||
silesia, uncompressed literals optimal, compress cctx, 4296055
|
||||
silesia, huffman literals, compress cctx, 6172202
|
||||
silesia, multithreaded with advanced params, compress cctx, 4842075
|
||||
github, level -5, compress cctx, 204407
|
||||
@@ -80,11 +80,11 @@ github, level 7, compress
|
||||
github, level 7 with dict, compress cctx, 38755
|
||||
github, level 9, compress cctx, 135122
|
||||
github, level 9 with dict, compress cctx, 39398
|
||||
github, level 13, compress cctx, 132729
|
||||
github, level 13, compress cctx, 132878
|
||||
github, level 13 with dict, compress cctx, 39948
|
||||
github, level 16, compress cctx, 132729
|
||||
github, level 16, compress cctx, 133209
|
||||
github, level 16 with dict, compress cctx, 37568
|
||||
github, level 19, compress cctx, 132729
|
||||
github, level 19, compress cctx, 132879
|
||||
github, level 19 with dict, compress cctx, 37567
|
||||
github, long distance mode, compress cctx, 141069
|
||||
github, multithreaded, compress cctx, 141069
|
||||
@@ -94,7 +94,7 @@ github, small hash log, compress
|
||||
github, small chain log, compress cctx, 139242
|
||||
github, explicit params, compress cctx, 140932
|
||||
github, uncompressed literals, compress cctx, 136332
|
||||
github, uncompressed literals optimal, compress cctx, 132729
|
||||
github, uncompressed literals optimal, compress cctx, 132879
|
||||
github, huffman literals, compress cctx, 175468
|
||||
github, multithreaded with advanced params, compress cctx, 141069
|
||||
silesia, level -5, zstdcli, 6857420
|
||||
@@ -109,8 +109,8 @@ silesia, level 6, zstdcli,
|
||||
silesia, level 7, zstdcli, 4567032
|
||||
silesia, level 9, zstdcli, 4543066
|
||||
silesia, level 13, zstdcli, 4494038
|
||||
silesia, level 16, zstdcli, 4359912
|
||||
silesia, level 19, zstdcli, 4296486
|
||||
silesia, level 16, zstdcli, 4360089
|
||||
silesia, level 19, zstdcli, 4296103
|
||||
silesia, long distance mode, zstdcli, 4833785
|
||||
silesia, multithreaded, zstdcli, 4842123
|
||||
silesia, multithreaded long distance mode, zstdcli, 4833785
|
||||
@@ -134,14 +134,14 @@ silesia.tar, level 6, zstdcli,
|
||||
silesia.tar, level 7, zstdcli, 4578719
|
||||
silesia.tar, level 9, zstdcli, 4552903
|
||||
silesia.tar, level 13, zstdcli, 4502960
|
||||
silesia.tar, level 16, zstdcli, 4360531
|
||||
silesia.tar, level 19, zstdcli, 4266974
|
||||
silesia.tar, level 16, zstdcli, 4360550
|
||||
silesia.tar, level 19, zstdcli, 4265915
|
||||
silesia.tar, no source size, zstdcli, 4854160
|
||||
silesia.tar, long distance mode, zstdcli, 4845745
|
||||
silesia.tar, multithreaded, zstdcli, 4854164
|
||||
silesia.tar, multithreaded long distance mode, zstdcli, 4845745
|
||||
silesia.tar, small window log, zstdcli, 7100701
|
||||
silesia.tar, small hash log, zstdcli, 6529289
|
||||
silesia.tar, small hash log, zstdcli, 6529264
|
||||
silesia.tar, small chain log, zstdcli, 4917022
|
||||
silesia.tar, explicit params, zstdcli, 4820713
|
||||
silesia.tar, uncompressed literals, zstdcli, 5122571
|
||||
@@ -170,11 +170,11 @@ github, level 7, zstdcli,
|
||||
github, level 7 with dict, zstdcli, 40745
|
||||
github, level 9, zstdcli, 137122
|
||||
github, level 9 with dict, zstdcli, 41393
|
||||
github, level 13, zstdcli, 134729
|
||||
github, level 13, zstdcli, 134878
|
||||
github, level 13 with dict, zstdcli, 41900
|
||||
github, level 16, zstdcli, 134729
|
||||
github, level 16, zstdcli, 135209
|
||||
github, level 16 with dict, zstdcli, 39577
|
||||
github, level 19, zstdcli, 134729
|
||||
github, level 19, zstdcli, 134879
|
||||
github, level 19 with dict, zstdcli, 39576
|
||||
github, long distance mode, zstdcli, 138332
|
||||
github, multithreaded, zstdcli, 138332
|
||||
@@ -184,7 +184,7 @@ github, small hash log, zstdcli,
|
||||
github, small chain log, zstdcli, 138341
|
||||
github, explicit params, zstdcli, 136197
|
||||
github, uncompressed literals, zstdcli, 167911
|
||||
github, uncompressed literals optimal, zstdcli, 159227
|
||||
github, uncompressed literals optimal, zstdcli, 154667
|
||||
github, huffman literals, zstdcli, 144365
|
||||
github, multithreaded with advanced params, zstdcli, 167911
|
||||
github.tar, level -5, zstdcli, 52119
|
||||
@@ -211,9 +211,9 @@ github.tar, level 9, zstdcli,
|
||||
github.tar, level 9 with dict, zstdcli, 36632
|
||||
github.tar, level 13, zstdcli, 35505
|
||||
github.tar, level 13 with dict, zstdcli, 37134
|
||||
github.tar, level 16, zstdcli, 40475
|
||||
github.tar, level 16, zstdcli, 40470
|
||||
github.tar, level 16 with dict, zstdcli, 33378
|
||||
github.tar, level 19, zstdcli, 32153
|
||||
github.tar, level 19, zstdcli, 32280
|
||||
github.tar, level 19 with dict, zstdcli, 32716
|
||||
github.tar, no source size, zstdcli, 38832
|
||||
github.tar, no source size with dict, zstdcli, 38004
|
||||
@@ -248,8 +248,8 @@ silesia, level 11 row 2, advanced
|
||||
silesia, level 12 row 1, advanced one pass, 4505046
|
||||
silesia, level 12 row 2, advanced one pass, 4503116
|
||||
silesia, level 13, advanced one pass, 4493990
|
||||
silesia, level 16, advanced one pass, 4359864
|
||||
silesia, level 19, advanced one pass, 4296438
|
||||
silesia, level 16, advanced one pass, 4360041
|
||||
silesia, level 19, advanced one pass, 4296055
|
||||
silesia, no source size, advanced one pass, 4842075
|
||||
silesia, long distance mode, advanced one pass, 4833710
|
||||
silesia, multithreaded, advanced one pass, 4842075
|
||||
@@ -282,14 +282,14 @@ silesia.tar, level 11 row 2, advanced
|
||||
silesia.tar, level 12 row 1, advanced one pass, 4514049
|
||||
silesia.tar, level 12 row 2, advanced one pass, 4513797
|
||||
silesia.tar, level 13, advanced one pass, 4502956
|
||||
silesia.tar, level 16, advanced one pass, 4360527
|
||||
silesia.tar, level 19, advanced one pass, 4266970
|
||||
silesia.tar, level 16, advanced one pass, 4360546
|
||||
silesia.tar, level 19, advanced one pass, 4265911
|
||||
silesia.tar, no source size, advanced one pass, 4854086
|
||||
silesia.tar, long distance mode, advanced one pass, 4840452
|
||||
silesia.tar, multithreaded, advanced one pass, 4854160
|
||||
silesia.tar, multithreaded long distance mode, advanced one pass, 4845741
|
||||
silesia.tar, small window log, advanced one pass, 7100655
|
||||
silesia.tar, small hash log, advanced one pass, 6529231
|
||||
silesia.tar, small hash log, advanced one pass, 6529206
|
||||
silesia.tar, small chain log, advanced one pass, 4917041
|
||||
silesia.tar, explicit params, advanced one pass, 4806855
|
||||
silesia.tar, uncompressed literals, advanced one pass, 5122473
|
||||
@@ -370,39 +370,39 @@ github, level 9 with dict dms, advanced
|
||||
github, level 9 with dict dds, advanced one pass, 39393
|
||||
github, level 9 with dict copy, advanced one pass, 39398
|
||||
github, level 9 with dict load, advanced one pass, 41710
|
||||
github, level 11 row 1, advanced one pass, 135119
|
||||
github, level 11 row 1, advanced one pass, 135367
|
||||
github, level 11 row 1 with dict dms, advanced one pass, 39671
|
||||
github, level 11 row 1 with dict dds, advanced one pass, 39671
|
||||
github, level 11 row 1 with dict copy, advanced one pass, 39651
|
||||
github, level 11 row 1 with dict load, advanced one pass, 41360
|
||||
github, level 11 row 2, advanced one pass, 135119
|
||||
github, level 11 row 2, advanced one pass, 135367
|
||||
github, level 11 row 2 with dict dms, advanced one pass, 39671
|
||||
github, level 11 row 2 with dict dds, advanced one pass, 39671
|
||||
github, level 11 row 2 with dict copy, advanced one pass, 39651
|
||||
github, level 11 row 2 with dict load, advanced one pass, 41360
|
||||
github, level 12 row 1, advanced one pass, 134180
|
||||
github, level 12 row 1, advanced one pass, 134402
|
||||
github, level 12 row 1 with dict dms, advanced one pass, 39677
|
||||
github, level 12 row 1 with dict dds, advanced one pass, 39677
|
||||
github, level 12 row 1 with dict copy, advanced one pass, 39677
|
||||
github, level 12 row 1 with dict load, advanced one pass, 41166
|
||||
github, level 12 row 2, advanced one pass, 134180
|
||||
github, level 12 row 2, advanced one pass, 134402
|
||||
github, level 12 row 2 with dict dms, advanced one pass, 39677
|
||||
github, level 12 row 2 with dict dds, advanced one pass, 39677
|
||||
github, level 12 row 2 with dict copy, advanced one pass, 39677
|
||||
github, level 12 row 2 with dict load, advanced one pass, 41166
|
||||
github, level 13, advanced one pass, 132729
|
||||
github, level 13, advanced one pass, 132878
|
||||
github, level 13 with dict, advanced one pass, 39900
|
||||
github, level 13 with dict dms, advanced one pass, 39900
|
||||
github, level 13 with dict dds, advanced one pass, 39900
|
||||
github, level 13 with dict copy, advanced one pass, 39948
|
||||
github, level 13 with dict load, advanced one pass, 42624
|
||||
github, level 16, advanced one pass, 132729
|
||||
github, level 16, advanced one pass, 133209
|
||||
github, level 16 with dict, advanced one pass, 37577
|
||||
github, level 16 with dict dms, advanced one pass, 37577
|
||||
github, level 16 with dict dds, advanced one pass, 37577
|
||||
github, level 16 with dict copy, advanced one pass, 37568
|
||||
github, level 16 with dict load, advanced one pass, 42338
|
||||
github, level 19, advanced one pass, 132729
|
||||
github, level 19, advanced one pass, 132879
|
||||
github, level 19 with dict, advanced one pass, 37576
|
||||
github, level 19 with dict dms, advanced one pass, 37576
|
||||
github, level 19 with dict dds, advanced one pass, 37576
|
||||
@@ -418,7 +418,7 @@ github, small hash log, advanced
|
||||
github, small chain log, advanced one pass, 136341
|
||||
github, explicit params, advanced one pass, 137727
|
||||
github, uncompressed literals, advanced one pass, 165911
|
||||
github, uncompressed literals optimal, advanced one pass, 157227
|
||||
github, uncompressed literals optimal, advanced one pass, 152667
|
||||
github, huffman literals, advanced one pass, 142365
|
||||
github, multithreaded with advanced params, advanced one pass, 165911
|
||||
github.tar, level -5, advanced one pass, 52115
|
||||
@@ -521,13 +521,13 @@ github.tar, level 13 with dict dms, advanced
|
||||
github.tar, level 13 with dict dds, advanced one pass, 37220
|
||||
github.tar, level 13 with dict copy, advanced one pass, 37130
|
||||
github.tar, level 13 with dict load, advanced one pass, 36010
|
||||
github.tar, level 16, advanced one pass, 40471
|
||||
github.tar, level 16, advanced one pass, 40466
|
||||
github.tar, level 16 with dict, advanced one pass, 33374
|
||||
github.tar, level 16 with dict dms, advanced one pass, 33206
|
||||
github.tar, level 16 with dict dds, advanced one pass, 33206
|
||||
github.tar, level 16 with dict copy, advanced one pass, 33374
|
||||
github.tar, level 16 with dict load, advanced one pass, 39081
|
||||
github.tar, level 19, advanced one pass, 32149
|
||||
github.tar, level 19, advanced one pass, 32276
|
||||
github.tar, level 19 with dict, advanced one pass, 32712
|
||||
github.tar, level 19 with dict dms, advanced one pass, 32555
|
||||
github.tar, level 19 with dict dds, advanced one pass, 32555
|
||||
@@ -566,8 +566,8 @@ silesia, level 11 row 2, advanced
|
||||
silesia, level 12 row 1, advanced one pass small out, 4505046
|
||||
silesia, level 12 row 2, advanced one pass small out, 4503116
|
||||
silesia, level 13, advanced one pass small out, 4493990
|
||||
silesia, level 16, advanced one pass small out, 4359864
|
||||
silesia, level 19, advanced one pass small out, 4296438
|
||||
silesia, level 16, advanced one pass small out, 4360041
|
||||
silesia, level 19, advanced one pass small out, 4296055
|
||||
silesia, no source size, advanced one pass small out, 4842075
|
||||
silesia, long distance mode, advanced one pass small out, 4833710
|
||||
silesia, multithreaded, advanced one pass small out, 4842075
|
||||
@@ -600,14 +600,14 @@ silesia.tar, level 11 row 2, advanced
|
||||
silesia.tar, level 12 row 1, advanced one pass small out, 4514049
|
||||
silesia.tar, level 12 row 2, advanced one pass small out, 4513797
|
||||
silesia.tar, level 13, advanced one pass small out, 4502956
|
||||
silesia.tar, level 16, advanced one pass small out, 4360527
|
||||
silesia.tar, level 19, advanced one pass small out, 4266970
|
||||
silesia.tar, level 16, advanced one pass small out, 4360546
|
||||
silesia.tar, level 19, advanced one pass small out, 4265911
|
||||
silesia.tar, no source size, advanced one pass small out, 4854086
|
||||
silesia.tar, long distance mode, advanced one pass small out, 4840452
|
||||
silesia.tar, multithreaded, advanced one pass small out, 4854160
|
||||
silesia.tar, multithreaded long distance mode, advanced one pass small out, 4845741
|
||||
silesia.tar, small window log, advanced one pass small out, 7100655
|
||||
silesia.tar, small hash log, advanced one pass small out, 6529231
|
||||
silesia.tar, small hash log, advanced one pass small out, 6529206
|
||||
silesia.tar, small chain log, advanced one pass small out, 4917041
|
||||
silesia.tar, explicit params, advanced one pass small out, 4806855
|
||||
silesia.tar, uncompressed literals, advanced one pass small out, 5122473
|
||||
@@ -688,39 +688,39 @@ github, level 9 with dict dms, advanced
|
||||
github, level 9 with dict dds, advanced one pass small out, 39393
|
||||
github, level 9 with dict copy, advanced one pass small out, 39398
|
||||
github, level 9 with dict load, advanced one pass small out, 41710
|
||||
github, level 11 row 1, advanced one pass small out, 135119
|
||||
github, level 11 row 1, advanced one pass small out, 135367
|
||||
github, level 11 row 1 with dict dms, advanced one pass small out, 39671
|
||||
github, level 11 row 1 with dict dds, advanced one pass small out, 39671
|
||||
github, level 11 row 1 with dict copy, advanced one pass small out, 39651
|
||||
github, level 11 row 1 with dict load, advanced one pass small out, 41360
|
||||
github, level 11 row 2, advanced one pass small out, 135119
|
||||
github, level 11 row 2, advanced one pass small out, 135367
|
||||
github, level 11 row 2 with dict dms, advanced one pass small out, 39671
|
||||
github, level 11 row 2 with dict dds, advanced one pass small out, 39671
|
||||
github, level 11 row 2 with dict copy, advanced one pass small out, 39651
|
||||
github, level 11 row 2 with dict load, advanced one pass small out, 41360
|
||||
github, level 12 row 1, advanced one pass small out, 134180
|
||||
github, level 12 row 1, advanced one pass small out, 134402
|
||||
github, level 12 row 1 with dict dms, advanced one pass small out, 39677
|
||||
github, level 12 row 1 with dict dds, advanced one pass small out, 39677
|
||||
github, level 12 row 1 with dict copy, advanced one pass small out, 39677
|
||||
github, level 12 row 1 with dict load, advanced one pass small out, 41166
|
||||
github, level 12 row 2, advanced one pass small out, 134180
|
||||
github, level 12 row 2, advanced one pass small out, 134402
|
||||
github, level 12 row 2 with dict dms, advanced one pass small out, 39677
|
||||
github, level 12 row 2 with dict dds, advanced one pass small out, 39677
|
||||
github, level 12 row 2 with dict copy, advanced one pass small out, 39677
|
||||
github, level 12 row 2 with dict load, advanced one pass small out, 41166
|
||||
github, level 13, advanced one pass small out, 132729
|
||||
github, level 13, advanced one pass small out, 132878
|
||||
github, level 13 with dict, advanced one pass small out, 39900
|
||||
github, level 13 with dict dms, advanced one pass small out, 39900
|
||||
github, level 13 with dict dds, advanced one pass small out, 39900
|
||||
github, level 13 with dict copy, advanced one pass small out, 39948
|
||||
github, level 13 with dict load, advanced one pass small out, 42624
|
||||
github, level 16, advanced one pass small out, 132729
|
||||
github, level 16, advanced one pass small out, 133209
|
||||
github, level 16 with dict, advanced one pass small out, 37577
|
||||
github, level 16 with dict dms, advanced one pass small out, 37577
|
||||
github, level 16 with dict dds, advanced one pass small out, 37577
|
||||
github, level 16 with dict copy, advanced one pass small out, 37568
|
||||
github, level 16 with dict load, advanced one pass small out, 42338
|
||||
github, level 19, advanced one pass small out, 132729
|
||||
github, level 19, advanced one pass small out, 132879
|
||||
github, level 19 with dict, advanced one pass small out, 37576
|
||||
github, level 19 with dict dms, advanced one pass small out, 37576
|
||||
github, level 19 with dict dds, advanced one pass small out, 37576
|
||||
@@ -736,7 +736,7 @@ github, small hash log, advanced
|
||||
github, small chain log, advanced one pass small out, 136341
|
||||
github, explicit params, advanced one pass small out, 137727
|
||||
github, uncompressed literals, advanced one pass small out, 165911
|
||||
github, uncompressed literals optimal, advanced one pass small out, 157227
|
||||
github, uncompressed literals optimal, advanced one pass small out, 152667
|
||||
github, huffman literals, advanced one pass small out, 142365
|
||||
github, multithreaded with advanced params, advanced one pass small out, 165911
|
||||
github.tar, level -5, advanced one pass small out, 52115
|
||||
@@ -839,13 +839,13 @@ github.tar, level 13 with dict dms, advanced
|
||||
github.tar, level 13 with dict dds, advanced one pass small out, 37220
|
||||
github.tar, level 13 with dict copy, advanced one pass small out, 37130
|
||||
github.tar, level 13 with dict load, advanced one pass small out, 36010
|
||||
github.tar, level 16, advanced one pass small out, 40471
|
||||
github.tar, level 16, advanced one pass small out, 40466
|
||||
github.tar, level 16 with dict, advanced one pass small out, 33374
|
||||
github.tar, level 16 with dict dms, advanced one pass small out, 33206
|
||||
github.tar, level 16 with dict dds, advanced one pass small out, 33206
|
||||
github.tar, level 16 with dict copy, advanced one pass small out, 33374
|
||||
github.tar, level 16 with dict load, advanced one pass small out, 39081
|
||||
github.tar, level 19, advanced one pass small out, 32149
|
||||
github.tar, level 19, advanced one pass small out, 32276
|
||||
github.tar, level 19 with dict, advanced one pass small out, 32712
|
||||
github.tar, level 19 with dict dms, advanced one pass small out, 32555
|
||||
github.tar, level 19 with dict dds, advanced one pass small out, 32555
|
||||
@@ -884,8 +884,8 @@ silesia, level 11 row 2, advanced
|
||||
silesia, level 12 row 1, advanced streaming, 4505046
|
||||
silesia, level 12 row 2, advanced streaming, 4503116
|
||||
silesia, level 13, advanced streaming, 4493990
|
||||
silesia, level 16, advanced streaming, 4359864
|
||||
silesia, level 19, advanced streaming, 4296438
|
||||
silesia, level 16, advanced streaming, 4360041
|
||||
silesia, level 19, advanced streaming, 4296055
|
||||
silesia, no source size, advanced streaming, 4842039
|
||||
silesia, long distance mode, advanced streaming, 4833710
|
||||
silesia, multithreaded, advanced streaming, 4842075
|
||||
@@ -918,14 +918,14 @@ silesia.tar, level 11 row 2, advanced
|
||||
silesia.tar, level 12 row 1, advanced streaming, 4514049
|
||||
silesia.tar, level 12 row 2, advanced streaming, 4513797
|
||||
silesia.tar, level 13, advanced streaming, 4502956
|
||||
silesia.tar, level 16, advanced streaming, 4360527
|
||||
silesia.tar, level 19, advanced streaming, 4266970
|
||||
silesia.tar, level 16, advanced streaming, 4360546
|
||||
silesia.tar, level 19, advanced streaming, 4265911
|
||||
silesia.tar, no source size, advanced streaming, 4859267
|
||||
silesia.tar, long distance mode, advanced streaming, 4840452
|
||||
silesia.tar, multithreaded, advanced streaming, 4854160
|
||||
silesia.tar, multithreaded long distance mode, advanced streaming, 4845741
|
||||
silesia.tar, small window log, advanced streaming, 7117559
|
||||
silesia.tar, small hash log, advanced streaming, 6529234
|
||||
silesia.tar, small hash log, advanced streaming, 6529209
|
||||
silesia.tar, small chain log, advanced streaming, 4917021
|
||||
silesia.tar, explicit params, advanced streaming, 4806873
|
||||
silesia.tar, uncompressed literals, advanced streaming, 5127423
|
||||
@@ -1006,39 +1006,39 @@ github, level 9 with dict dms, advanced
|
||||
github, level 9 with dict dds, advanced streaming, 39393
|
||||
github, level 9 with dict copy, advanced streaming, 39398
|
||||
github, level 9 with dict load, advanced streaming, 41710
|
||||
github, level 11 row 1, advanced streaming, 135119
|
||||
github, level 11 row 1, advanced streaming, 135367
|
||||
github, level 11 row 1 with dict dms, advanced streaming, 39671
|
||||
github, level 11 row 1 with dict dds, advanced streaming, 39671
|
||||
github, level 11 row 1 with dict copy, advanced streaming, 39651
|
||||
github, level 11 row 1 with dict load, advanced streaming, 41360
|
||||
github, level 11 row 2, advanced streaming, 135119
|
||||
github, level 11 row 2, advanced streaming, 135367
|
||||
github, level 11 row 2 with dict dms, advanced streaming, 39671
|
||||
github, level 11 row 2 with dict dds, advanced streaming, 39671
|
||||
github, level 11 row 2 with dict copy, advanced streaming, 39651
|
||||
github, level 11 row 2 with dict load, advanced streaming, 41360
|
||||
github, level 12 row 1, advanced streaming, 134180
|
||||
github, level 12 row 1, advanced streaming, 134402
|
||||
github, level 12 row 1 with dict dms, advanced streaming, 39677
|
||||
github, level 12 row 1 with dict dds, advanced streaming, 39677
|
||||
github, level 12 row 1 with dict copy, advanced streaming, 39677
|
||||
github, level 12 row 1 with dict load, advanced streaming, 41166
|
||||
github, level 12 row 2, advanced streaming, 134180
|
||||
github, level 12 row 2, advanced streaming, 134402
|
||||
github, level 12 row 2 with dict dms, advanced streaming, 39677
|
||||
github, level 12 row 2 with dict dds, advanced streaming, 39677
|
||||
github, level 12 row 2 with dict copy, advanced streaming, 39677
|
||||
github, level 12 row 2 with dict load, advanced streaming, 41166
|
||||
github, level 13, advanced streaming, 132729
|
||||
github, level 13, advanced streaming, 132878
|
||||
github, level 13 with dict, advanced streaming, 39900
|
||||
github, level 13 with dict dms, advanced streaming, 39900
|
||||
github, level 13 with dict dds, advanced streaming, 39900
|
||||
github, level 13 with dict copy, advanced streaming, 39948
|
||||
github, level 13 with dict load, advanced streaming, 42624
|
||||
github, level 16, advanced streaming, 132729
|
||||
github, level 16, advanced streaming, 133209
|
||||
github, level 16 with dict, advanced streaming, 37577
|
||||
github, level 16 with dict dms, advanced streaming, 37577
|
||||
github, level 16 with dict dds, advanced streaming, 37577
|
||||
github, level 16 with dict copy, advanced streaming, 37568
|
||||
github, level 16 with dict load, advanced streaming, 42338
|
||||
github, level 19, advanced streaming, 132729
|
||||
github, level 19, advanced streaming, 132879
|
||||
github, level 19 with dict, advanced streaming, 37576
|
||||
github, level 19 with dict dms, advanced streaming, 37576
|
||||
github, level 19 with dict dds, advanced streaming, 37576
|
||||
@@ -1054,7 +1054,7 @@ github, small hash log, advanced
|
||||
github, small chain log, advanced streaming, 136341
|
||||
github, explicit params, advanced streaming, 137727
|
||||
github, uncompressed literals, advanced streaming, 165911
|
||||
github, uncompressed literals optimal, advanced streaming, 157227
|
||||
github, uncompressed literals optimal, advanced streaming, 152667
|
||||
github, huffman literals, advanced streaming, 142365
|
||||
github, multithreaded with advanced params, advanced streaming, 165911
|
||||
github.tar, level -5, advanced streaming, 52152
|
||||
@@ -1157,13 +1157,13 @@ github.tar, level 13 with dict dms, advanced
|
||||
github.tar, level 13 with dict dds, advanced streaming, 37220
|
||||
github.tar, level 13 with dict copy, advanced streaming, 37130
|
||||
github.tar, level 13 with dict load, advanced streaming, 36010
|
||||
github.tar, level 16, advanced streaming, 40471
|
||||
github.tar, level 16, advanced streaming, 40466
|
||||
github.tar, level 16 with dict, advanced streaming, 33374
|
||||
github.tar, level 16 with dict dms, advanced streaming, 33206
|
||||
github.tar, level 16 with dict dds, advanced streaming, 33206
|
||||
github.tar, level 16 with dict copy, advanced streaming, 33374
|
||||
github.tar, level 16 with dict load, advanced streaming, 39081
|
||||
github.tar, level 19, advanced streaming, 32149
|
||||
github.tar, level 19, advanced streaming, 32276
|
||||
github.tar, level 19 with dict, advanced streaming, 32712
|
||||
github.tar, level 19 with dict dms, advanced streaming, 32555
|
||||
github.tar, level 19 with dict dds, advanced streaming, 32555
|
||||
@@ -1194,11 +1194,11 @@ silesia, level 6, old stre
|
||||
silesia, level 7, old streaming, 4566984
|
||||
silesia, level 9, old streaming, 4543018
|
||||
silesia, level 13, old streaming, 4493990
|
||||
silesia, level 16, old streaming, 4359864
|
||||
silesia, level 19, old streaming, 4296438
|
||||
silesia, level 16, old streaming, 4360041
|
||||
silesia, level 19, old streaming, 4296055
|
||||
silesia, no source size, old streaming, 4842039
|
||||
silesia, uncompressed literals, old streaming, 4842075
|
||||
silesia, uncompressed literals optimal, old streaming, 4296438
|
||||
silesia, uncompressed literals optimal, old streaming, 4296055
|
||||
silesia, huffman literals, old streaming, 6172207
|
||||
silesia.tar, level -5, old streaming, 6856523
|
||||
silesia.tar, level -3, old streaming, 6505954
|
||||
@@ -1212,11 +1212,11 @@ silesia.tar, level 6, old stre
|
||||
silesia.tar, level 7, old streaming, 4576664
|
||||
silesia.tar, level 9, old streaming, 4552900
|
||||
silesia.tar, level 13, old streaming, 4502956
|
||||
silesia.tar, level 16, old streaming, 4360527
|
||||
silesia.tar, level 19, old streaming, 4266970
|
||||
silesia.tar, level 16, old streaming, 4360546
|
||||
silesia.tar, level 19, old streaming, 4265911
|
||||
silesia.tar, no source size, old streaming, 4859267
|
||||
silesia.tar, uncompressed literals, old streaming, 4859271
|
||||
silesia.tar, uncompressed literals optimal, old streaming, 4266970
|
||||
silesia.tar, uncompressed literals optimal, old streaming, 4265911
|
||||
silesia.tar, huffman literals, old streaming, 6179056
|
||||
github, level -5, old streaming, 204407
|
||||
github, level -5 with dict, old streaming, 46718
|
||||
@@ -1240,16 +1240,16 @@ github, level 7, old stre
|
||||
github, level 7 with dict, old streaming, 38758
|
||||
github, level 9, old streaming, 135122
|
||||
github, level 9 with dict, old streaming, 39437
|
||||
github, level 13, old streaming, 132729
|
||||
github, level 13, old streaming, 132878
|
||||
github, level 13 with dict, old streaming, 39900
|
||||
github, level 16, old streaming, 132729
|
||||
github, level 16, old streaming, 133209
|
||||
github, level 16 with dict, old streaming, 37577
|
||||
github, level 19, old streaming, 132729
|
||||
github, level 19, old streaming, 132879
|
||||
github, level 19 with dict, old streaming, 37576
|
||||
github, no source size, old streaming, 140599
|
||||
github, no source size with dict, old streaming, 40654
|
||||
github, uncompressed literals, old streaming, 136332
|
||||
github, uncompressed literals optimal, old streaming, 132729
|
||||
github, uncompressed literals optimal, old streaming, 132879
|
||||
github, huffman literals, old streaming, 175468
|
||||
github.tar, level -5, old streaming, 52152
|
||||
github.tar, level -5 with dict, old streaming, 51045
|
||||
@@ -1275,14 +1275,14 @@ github.tar, level 9, old stre
|
||||
github.tar, level 9 with dict, old streaming, 36484
|
||||
github.tar, level 13, old streaming, 35501
|
||||
github.tar, level 13 with dict, old streaming, 37130
|
||||
github.tar, level 16, old streaming, 40471
|
||||
github.tar, level 16, old streaming, 40466
|
||||
github.tar, level 16 with dict, old streaming, 33374
|
||||
github.tar, level 19, old streaming, 32149
|
||||
github.tar, level 19, old streaming, 32276
|
||||
github.tar, level 19 with dict, old streaming, 32712
|
||||
github.tar, no source size, old streaming, 38828
|
||||
github.tar, no source size with dict, old streaming, 38000
|
||||
github.tar, uncompressed literals, old streaming, 38831
|
||||
github.tar, uncompressed literals optimal, old streaming, 32149
|
||||
github.tar, uncompressed literals optimal, old streaming, 32276
|
||||
github.tar, huffman literals, old streaming, 42560
|
||||
silesia, level -5, old streaming advanced, 6854744
|
||||
silesia, level -3, old streaming advanced, 6503319
|
||||
@@ -1296,8 +1296,8 @@ silesia, level 6, old stre
|
||||
silesia, level 7, old streaming advanced, 4566984
|
||||
silesia, level 9, old streaming advanced, 4543018
|
||||
silesia, level 13, old streaming advanced, 4493990
|
||||
silesia, level 16, old streaming advanced, 4359864
|
||||
silesia, level 19, old streaming advanced, 4296438
|
||||
silesia, level 16, old streaming advanced, 4360041
|
||||
silesia, level 19, old streaming advanced, 4296055
|
||||
silesia, no source size, old streaming advanced, 4842039
|
||||
silesia, long distance mode, old streaming advanced, 4842075
|
||||
silesia, multithreaded, old streaming advanced, 4842075
|
||||
@@ -1307,7 +1307,7 @@ silesia, small hash log, old stre
|
||||
silesia, small chain log, old streaming advanced, 4912197
|
||||
silesia, explicit params, old streaming advanced, 4795452
|
||||
silesia, uncompressed literals, old streaming advanced, 4842075
|
||||
silesia, uncompressed literals optimal, old streaming advanced, 4296438
|
||||
silesia, uncompressed literals optimal, old streaming advanced, 4296055
|
||||
silesia, huffman literals, old streaming advanced, 6172207
|
||||
silesia, multithreaded with advanced params, old streaming advanced, 4842075
|
||||
silesia.tar, level -5, old streaming advanced, 6856523
|
||||
@@ -1322,18 +1322,18 @@ silesia.tar, level 6, old stre
|
||||
silesia.tar, level 7, old streaming advanced, 4576664
|
||||
silesia.tar, level 9, old streaming advanced, 4552900
|
||||
silesia.tar, level 13, old streaming advanced, 4502956
|
||||
silesia.tar, level 16, old streaming advanced, 4360527
|
||||
silesia.tar, level 19, old streaming advanced, 4266970
|
||||
silesia.tar, level 16, old streaming advanced, 4360546
|
||||
silesia.tar, level 19, old streaming advanced, 4265911
|
||||
silesia.tar, no source size, old streaming advanced, 4859267
|
||||
silesia.tar, long distance mode, old streaming advanced, 4859271
|
||||
silesia.tar, multithreaded, old streaming advanced, 4859271
|
||||
silesia.tar, multithreaded long distance mode, old streaming advanced, 4859271
|
||||
silesia.tar, small window log, old streaming advanced, 7117562
|
||||
silesia.tar, small hash log, old streaming advanced, 6529234
|
||||
silesia.tar, small hash log, old streaming advanced, 6529209
|
||||
silesia.tar, small chain log, old streaming advanced, 4917021
|
||||
silesia.tar, explicit params, old streaming advanced, 4806873
|
||||
silesia.tar, uncompressed literals, old streaming advanced, 4859271
|
||||
silesia.tar, uncompressed literals optimal, old streaming advanced, 4266970
|
||||
silesia.tar, uncompressed literals optimal, old streaming advanced, 4265911
|
||||
silesia.tar, huffman literals, old streaming advanced, 6179056
|
||||
silesia.tar, multithreaded with advanced params, old streaming advanced, 4859271
|
||||
github, level -5, old streaming advanced, 213265
|
||||
@@ -1360,9 +1360,9 @@ github, level 9, old stre
|
||||
github, level 9 with dict, old streaming advanced, 38981
|
||||
github, level 13, old streaming advanced, 138676
|
||||
github, level 13 with dict, old streaming advanced, 39725
|
||||
github, level 16, old streaming advanced, 138676
|
||||
github, level 16, old streaming advanced, 138575
|
||||
github, level 16 with dict, old streaming advanced, 40789
|
||||
github, level 19, old streaming advanced, 132729
|
||||
github, level 19, old streaming advanced, 132879
|
||||
github, level 19 with dict, old streaming advanced, 37576
|
||||
github, no source size, old streaming advanced, 140599
|
||||
github, no source size with dict, old streaming advanced, 40608
|
||||
@@ -1374,7 +1374,7 @@ github, small hash log, old stre
|
||||
github, small chain log, old streaming advanced, 139275
|
||||
github, explicit params, old streaming advanced, 140937
|
||||
github, uncompressed literals, old streaming advanced, 141104
|
||||
github, uncompressed literals optimal, old streaming advanced, 132729
|
||||
github, uncompressed literals optimal, old streaming advanced, 132879
|
||||
github, huffman literals, old streaming advanced, 181107
|
||||
github, multithreaded with advanced params, old streaming advanced, 141104
|
||||
github.tar, level -5, old streaming advanced, 52152
|
||||
@@ -1401,9 +1401,9 @@ github.tar, level 9, old stre
|
||||
github.tar, level 9 with dict, old streaming advanced, 36312
|
||||
github.tar, level 13, old streaming advanced, 35501
|
||||
github.tar, level 13 with dict, old streaming advanced, 35807
|
||||
github.tar, level 16, old streaming advanced, 40471
|
||||
github.tar, level 16, old streaming advanced, 40466
|
||||
github.tar, level 16 with dict, old streaming advanced, 38578
|
||||
github.tar, level 19, old streaming advanced, 32149
|
||||
github.tar, level 19, old streaming advanced, 32276
|
||||
github.tar, level 19 with dict, old streaming advanced, 32704
|
||||
github.tar, no source size, old streaming advanced, 38828
|
||||
github.tar, no source size with dict, old streaming advanced, 38015
|
||||
@@ -1415,7 +1415,7 @@ github.tar, small hash log, old stre
|
||||
github.tar, small chain log, old streaming advanced, 41669
|
||||
github.tar, explicit params, old streaming advanced, 41385
|
||||
github.tar, uncompressed literals, old streaming advanced, 38831
|
||||
github.tar, uncompressed literals optimal, old streaming advanced, 32149
|
||||
github.tar, uncompressed literals optimal, old streaming advanced, 32276
|
||||
github.tar, huffman literals, old streaming advanced, 42560
|
||||
github.tar, multithreaded with advanced params, old streaming advanced, 38831
|
||||
github, level -5 with dict, old streaming cdict, 46718
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# ################################################################
|
||||
# Copyright (c) Facebook, Inc.
|
||||
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -83,8 +83,8 @@ def valid_copyright(lines):
|
||||
continue
|
||||
if "present" in line:
|
||||
return (False, f"Copyright line '{line}' contains 'present'!")
|
||||
if "Facebook, Inc" not in line:
|
||||
return (False, f"Copyright line '{line}' does not contain 'Facebook, Inc'")
|
||||
if "Meta Platforms, Inc" not in line:
|
||||
return (False, f"Copyright line '{line}' does not contain 'Meta Platforms, Inc'")
|
||||
year = YEAR_REGEX.search(line)
|
||||
if year is not None:
|
||||
return (False, f"Copyright line '{line}' contains {year.group(0)}; it should be yearless")
|
||||
|
||||
+89
-72
@@ -2,7 +2,7 @@
|
||||
"""Test zstd interoperability between versions"""
|
||||
|
||||
# ################################################################
|
||||
# Copyright (c) Yann Collet, Facebook, Inc.
|
||||
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -23,14 +23,25 @@ from subprocess import Popen, PIPE
|
||||
repo_url = 'https://github.com/facebook/zstd.git'
|
||||
tmp_dir_name = 'tests/versionsTest'
|
||||
make_cmd = 'make'
|
||||
make_args = ['-j','CFLAGS=-O1']
|
||||
make_args = ['-j','CFLAGS=-O0']
|
||||
git_cmd = 'git'
|
||||
test_dat_src = 'README.md'
|
||||
test_dat = 'test_dat'
|
||||
head = 'vdevel'
|
||||
dict_source = 'dict_source'
|
||||
dict_files = './zstd/programs/*.c ./zstd/lib/common/*.c ./zstd/lib/compress/*.c ./zstd/lib/decompress/*.c ./zstd/lib/dictBuilder/*.c ./zstd/lib/legacy/*.c '
|
||||
dict_files += './zstd/programs/*.h ./zstd/lib/common/*.h ./zstd/lib/compress/*.h ./zstd/lib/dictBuilder/*.h ./zstd/lib/legacy/*.h'
|
||||
dict_globs = [
|
||||
'programs/*.c',
|
||||
'lib/common/*.c',
|
||||
'lib/compress/*.c',
|
||||
'lib/decompress/*.c',
|
||||
'lib/dictBuilder/*.c',
|
||||
'lib/legacy/*.c',
|
||||
'programs/*.h',
|
||||
'lib/common/*.h',
|
||||
'lib/compress/*.h',
|
||||
'lib/dictBuilder/*.h',
|
||||
'lib/legacy/*.h'
|
||||
]
|
||||
|
||||
|
||||
def execute(command, print_output=False, print_error=True, param_shell=False):
|
||||
@@ -74,59 +85,85 @@ def get_git_tags():
|
||||
return tags
|
||||
|
||||
|
||||
def create_dict(tag, dict_source_path):
|
||||
def dict_ok(tag, dict_name, sample):
|
||||
if not os.path.isfile(dict_name):
|
||||
return False
|
||||
try:
|
||||
cmd = ['./zstd.' + tag, '-D', dict_name]
|
||||
with open(sample, "rb") as i:
|
||||
subprocess.check_call(cmd, stdin=i, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
return True
|
||||
except:
|
||||
return False
|
||||
|
||||
|
||||
def create_dict(tag, dict_source_path, fallback_tag=None):
|
||||
dict_name = 'dict.' + tag
|
||||
if not os.path.isfile(dict_name):
|
||||
cFiles = glob.glob(dict_source_path + "/*.c")
|
||||
hFiles = glob.glob(dict_source_path + "/*.h")
|
||||
# Ensure the dictionary builder is deterministic
|
||||
files = sorted(cFiles + hFiles)
|
||||
if tag == 'v0.5.0':
|
||||
result = execute('./dictBuilder.' + tag + ' ' + ' '.join(cFiles) + ' ' + ' '.join(hFiles) + ' -o ' + dict_name, print_output=False, param_shell=True)
|
||||
result = execute('./dictBuilder.' + tag + ' ' + ' '.join(files) + ' -o ' + dict_name, print_output=False, param_shell=True)
|
||||
else:
|
||||
result = execute('./zstd.' + tag + ' -f --train ' + ' '.join(cFiles) + ' ' + ' '.join(hFiles) + ' -o ' + dict_name, print_output=False, param_shell=True)
|
||||
if result == 0:
|
||||
result = execute('./zstd.' + tag + ' -f --train ' + ' '.join(files) + ' -o ' + dict_name, print_output=False, param_shell=True)
|
||||
if result == 0 and dict_ok(tag, dict_name, files[0]):
|
||||
print(dict_name + ' created')
|
||||
elif fallback_tag is not None:
|
||||
fallback_dict_name = 'dict.' + fallback_tag
|
||||
print('creating dictionary ' + dict_name + ' failed, falling back to ' + fallback_dict_name)
|
||||
shutil.copy(fallback_dict_name, dict_name)
|
||||
else:
|
||||
print('ERROR: creating of ' + dict_name + ' failed')
|
||||
raise RuntimeError('ERROR: creating of ' + dict_name + ' failed')
|
||||
else:
|
||||
print(dict_name + ' already exists')
|
||||
|
||||
|
||||
def zstd(tag, args, input_file, output_file):
|
||||
"""
|
||||
Zstd compress input_file to output_file.
|
||||
Need this helper because 0.5.0 is broken when stdout is not a TTY.
|
||||
Throws an exception if the command returns non-zero.
|
||||
"""
|
||||
with open(input_file, "rb") as i:
|
||||
with open(output_file, "wb") as o:
|
||||
cmd = ['./zstd.' + tag] + args
|
||||
print("Running: '{}', input={}, output={}" .format(
|
||||
' '.join(cmd), input_file, output_file
|
||||
))
|
||||
result = subprocess.run(cmd, stdin=i, stdout=o, stderr=subprocess.PIPE)
|
||||
print("Stderr: {}".format(result.stderr.decode("ascii")))
|
||||
result.check_returncode()
|
||||
|
||||
|
||||
def dict_compress_sample(tag, sample):
|
||||
dict_name = 'dict.' + tag
|
||||
DEVNULL = open(os.devnull, 'wb')
|
||||
if subprocess.call(['./zstd.' + tag, '-D', dict_name, '-f', sample], stderr=DEVNULL) == 0:
|
||||
os.rename(sample + '.zst', sample + '_01_64_' + tag + '_dictio.zst')
|
||||
if subprocess.call(['./zstd.' + tag, '-D', dict_name, '-5f', sample], stderr=DEVNULL) == 0:
|
||||
os.rename(sample + '.zst', sample + '_05_64_' + tag + '_dictio.zst')
|
||||
if subprocess.call(['./zstd.' + tag, '-D', dict_name, '-9f', sample], stderr=DEVNULL) == 0:
|
||||
os.rename(sample + '.zst', sample + '_09_64_' + tag + '_dictio.zst')
|
||||
if subprocess.call(['./zstd.' + tag, '-D', dict_name, '-15f', sample], stderr=DEVNULL) == 0:
|
||||
os.rename(sample + '.zst', sample + '_15_64_' + tag + '_dictio.zst')
|
||||
if subprocess.call(['./zstd.' + tag, '-D', dict_name, '-18f', sample], stderr=DEVNULL) == 0:
|
||||
os.rename(sample + '.zst', sample + '_18_64_' + tag + '_dictio.zst')
|
||||
verbose = ['-v', '-v', '-v']
|
||||
zstd(tag, ['-D', dict_name, '-1'] + verbose, sample, sample + '_01_64_' + tag + '_dictio.zst')
|
||||
zstd(tag, ['-D', dict_name, '-3'], sample, sample + '_03_64_' + tag + '_dictio.zst')
|
||||
zstd(tag, ['-D', dict_name, '-5'], sample, sample + '_05_64_' + tag + '_dictio.zst')
|
||||
zstd(tag, ['-D', dict_name, '-9'], sample, sample + '_09_64_' + tag + '_dictio.zst')
|
||||
zstd(tag, ['-D', dict_name, '-15'], sample, sample + '_15_64_' + tag + '_dictio.zst')
|
||||
zstd(tag, ['-D', dict_name, '-18'], sample, sample + '_18_64_' + tag + '_dictio.zst')
|
||||
# zstdFiles = glob.glob("*.zst*")
|
||||
# print(zstdFiles)
|
||||
print(tag + " : dict compression completed")
|
||||
|
||||
|
||||
def compress_sample(tag, sample):
|
||||
DEVNULL = open(os.devnull, 'wb')
|
||||
if subprocess.call(['./zstd.' + tag, '-f', sample], stderr=DEVNULL) == 0:
|
||||
os.rename(sample + '.zst', sample + '_01_64_' + tag + '_nodict.zst')
|
||||
if subprocess.call(['./zstd.' + tag, '-5f', sample], stderr=DEVNULL) == 0:
|
||||
os.rename(sample + '.zst', sample + '_05_64_' + tag + '_nodict.zst')
|
||||
if subprocess.call(['./zstd.' + tag, '-9f', sample], stderr=DEVNULL) == 0:
|
||||
os.rename(sample + '.zst', sample + '_09_64_' + tag + '_nodict.zst')
|
||||
if subprocess.call(['./zstd.' + tag, '-15f', sample], stderr=DEVNULL) == 0:
|
||||
os.rename(sample + '.zst', sample + '_15_64_' + tag + '_nodict.zst')
|
||||
if subprocess.call(['./zstd.' + tag, '-18f', sample], stderr=DEVNULL) == 0:
|
||||
os.rename(sample + '.zst', sample + '_18_64_' + tag + '_nodict.zst')
|
||||
zstd(tag, ['-1'], sample, sample + '_01_64_' + tag + '_nodict.zst')
|
||||
zstd(tag, ['-3'], sample, sample + '_03_64_' + tag + '_nodict.zst')
|
||||
zstd(tag, ['-5'], sample, sample + '_05_64_' + tag + '_nodict.zst')
|
||||
zstd(tag, ['-9'], sample, sample + '_09_64_' + tag + '_nodict.zst')
|
||||
zstd(tag, ['-15'], sample, sample + '_15_64_' + tag + '_nodict.zst')
|
||||
zstd(tag, ['-18'], sample, sample + '_18_64_' + tag + '_nodict.zst')
|
||||
# zstdFiles = glob.glob("*.zst*")
|
||||
# print(zstdFiles)
|
||||
print(tag + " : compression completed")
|
||||
|
||||
|
||||
# http://stackoverflow.com/a/19711609/2132223
|
||||
# https://stackoverflow.com/a/19711609/2132223
|
||||
def sha1_of_file(filepath):
|
||||
with open(filepath, 'rb') as f:
|
||||
return hashlib.sha1(f.read()).hexdigest()
|
||||
@@ -150,23 +187,13 @@ def decompress_zst(tag):
|
||||
dec_error = 0
|
||||
list_zst = sorted(glob.glob('*_nodict.zst'))
|
||||
for file_zst in list_zst:
|
||||
print(file_zst, end=' ')
|
||||
print(tag, end=' ')
|
||||
print(file_zst + ' ' + tag)
|
||||
file_dec = file_zst + '_d64_' + tag + '.dec'
|
||||
if tag <= 'v0.5.0':
|
||||
params = ['./zstd.' + tag, '-df', file_zst, file_dec]
|
||||
zstd(tag, ['-d'], file_zst, file_dec)
|
||||
if not filecmp.cmp(file_dec, test_dat):
|
||||
raise RuntimeError('Decompression failed: tag={} file={}'.format(tag, file_zst))
|
||||
else:
|
||||
params = ['./zstd.' + tag, '-df', file_zst, '-o', file_dec]
|
||||
if execute(params) == 0:
|
||||
if not filecmp.cmp(file_dec, test_dat):
|
||||
print('ERR !! ')
|
||||
dec_error = 1
|
||||
else:
|
||||
print('OK ')
|
||||
else:
|
||||
print('command does not work')
|
||||
dec_error = 1
|
||||
return dec_error
|
||||
print('OK ')
|
||||
|
||||
|
||||
def decompress_dict(tag):
|
||||
@@ -181,22 +208,13 @@ def decompress_dict(tag):
|
||||
if tag == 'v0.6.0' and dict_tag < 'v0.6.0':
|
||||
continue
|
||||
dict_name = 'dict.' + dict_tag
|
||||
print(file_zst + ' ' + tag + ' dict=' + dict_tag, end=' ')
|
||||
print(file_zst + ' ' + tag + ' dict=' + dict_tag)
|
||||
file_dec = file_zst + '_d64_' + tag + '.dec'
|
||||
if tag <= 'v0.5.0':
|
||||
params = ['./zstd.' + tag, '-D', dict_name, '-df', file_zst, file_dec]
|
||||
zstd(tag, ['-D', dict_name, '-d'], file_zst, file_dec)
|
||||
if not filecmp.cmp(file_dec, test_dat):
|
||||
raise RuntimeError('Decompression failed: tag={} file={}'.format(tag, file_zst))
|
||||
else:
|
||||
params = ['./zstd.' + tag, '-D', dict_name, '-df', file_zst, '-o', file_dec]
|
||||
if execute(params) == 0:
|
||||
if not filecmp.cmp(file_dec, test_dat):
|
||||
print('ERR !! ')
|
||||
dec_error = 1
|
||||
else:
|
||||
print('OK ')
|
||||
else:
|
||||
print('command does not work')
|
||||
dec_error = 1
|
||||
return dec_error
|
||||
print('OK ')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
@@ -260,32 +278,31 @@ if __name__ == '__main__':
|
||||
# copy *.c and *.h to a temporary directory ("dict_source")
|
||||
if not os.path.isdir(dict_source_path):
|
||||
os.mkdir(dict_source_path)
|
||||
print('cp ' + dict_files + ' ' + dict_source_path)
|
||||
execute('cp ' + dict_files + ' ' + dict_source_path, param_shell=True)
|
||||
for dict_glob in dict_globs:
|
||||
files = glob.glob(dict_glob, root_dir=base_dir)
|
||||
for file in files:
|
||||
file = os.path.join(base_dir, file)
|
||||
print("copying " + file + " to " + dict_source_path)
|
||||
shutil.copy(file, dict_source_path)
|
||||
|
||||
print('-----------------------------------------------')
|
||||
print('Compress test.dat by all released zstd')
|
||||
print('-----------------------------------------------')
|
||||
|
||||
error_code = 0
|
||||
create_dict(head, dict_source_path)
|
||||
for tag in tags:
|
||||
print(tag)
|
||||
if tag >= 'v0.5.0':
|
||||
create_dict(tag, dict_source_path)
|
||||
create_dict(tag, dict_source_path, head)
|
||||
dict_compress_sample(tag, test_dat)
|
||||
remove_duplicates()
|
||||
error_code += decompress_dict(tag)
|
||||
decompress_dict(tag)
|
||||
compress_sample(tag, test_dat)
|
||||
remove_duplicates()
|
||||
error_code += decompress_zst(tag)
|
||||
decompress_zst(tag)
|
||||
|
||||
print('')
|
||||
print('Enumerate different compressed files')
|
||||
zstds = sorted(glob.glob('*.zst'))
|
||||
for zstd in zstds:
|
||||
print(zstd + ' : ' + repr(os.path.getsize(zstd)) + ', ' + sha1_of_file(zstd))
|
||||
|
||||
if error_code != 0:
|
||||
print('====== ERROR !!! =======')
|
||||
|
||||
sys.exit(error_code)
|
||||
|
||||
+537
-5
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) Yann Collet, Facebook, Inc.
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under both the BSD-style license (found in the
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <stdlib.h> /* free */
|
||||
#include <stdio.h> /* fgets, sscanf */
|
||||
#include <string.h> /* strcmp */
|
||||
#include <time.h> /* time_t, time(), to randomize seed */
|
||||
#include <assert.h> /* assert */
|
||||
#include "timefn.h" /* UTIL_time_t, UTIL_getTime */
|
||||
#include "mem.h"
|
||||
@@ -39,7 +40,7 @@
|
||||
#include "seqgen.h"
|
||||
#include "util.h"
|
||||
#include "timefn.h" /* UTIL_time_t, UTIL_clockSpanMicro, UTIL_getTime */
|
||||
|
||||
#include "external_matchfinder.h" /* zstreamExternalMatchFinder, EMF_testCase */
|
||||
|
||||
/*-************************************
|
||||
* Constants
|
||||
@@ -259,7 +260,7 @@ static U32 badParameters(ZSTD_CCtx* zc, ZSTD_parameters const savedParams)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int basicUnitTests(U32 seed, double compressibility)
|
||||
static int basicUnitTests(U32 seed, double compressibility, int bigTests)
|
||||
{
|
||||
size_t const CNBufferSize = COMPRESSIBLE_NOISE_LENGTH;
|
||||
void* CNBuffer = malloc(CNBufferSize);
|
||||
@@ -1565,6 +1566,84 @@ static int basicUnitTests(U32 seed, double compressibility)
|
||||
CHECK(!ZSTD_isError(ZSTD_CCtx_setParameter(zc, ZSTD_c_srcSizeHint, -1)), "Out of range doesn't error");
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : ZSTD_lazy compress with hashLog = 29 and searchLog = 4 : ", testNb++);
|
||||
if (MEM_64bits()) {
|
||||
ZSTD_outBuffer out = { compressedBuffer, compressedBufferSize, 0 };
|
||||
ZSTD_inBuffer in = { CNBuffer, CNBufferSize, 0 };
|
||||
CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_strategy, ZSTD_lazy));
|
||||
/* Force enable the row based match finder */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_useRowMatchFinder, ZSTD_ps_enable));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_searchLog, 4));
|
||||
/* Set windowLog to 29 so the hashLog doesn't get sized down */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_windowLog, 29));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_hashLog, 29));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_checksumFlag, 1));
|
||||
/* Compress with continue first so the hashLog doesn't get sized down */
|
||||
CHECK_Z(ZSTD_compressStream2(zc, &out, &in, ZSTD_e_continue));
|
||||
CHECK_Z(ZSTD_compressStream2(zc, &out, &in, ZSTD_e_end));
|
||||
cSize = out.pos;
|
||||
CHECK_Z(ZSTD_decompress(decodedBuffer, CNBufferSize, compressedBuffer, cSize));
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : Test offset == windowSize : ", testNb++);
|
||||
{
|
||||
int windowLog;
|
||||
int const kMaxWindowLog = bigTests ? 29 : 26;
|
||||
size_t const kNbSequences = 10000;
|
||||
size_t const kMaxSrcSize = (1u << kMaxWindowLog) + 10 * kNbSequences;
|
||||
char* src = calloc(kMaxSrcSize, 1);
|
||||
ZSTD_Sequence* sequences = malloc(sizeof(ZSTD_Sequence) * kNbSequences);
|
||||
for (windowLog = ZSTD_WINDOWLOG_MIN; windowLog <= kMaxWindowLog; ++windowLog) {
|
||||
size_t const srcSize = ((size_t)1 << windowLog) + 10 * (kNbSequences - 1);
|
||||
|
||||
sequences[0].offset = 32;
|
||||
sequences[0].litLength = 32;
|
||||
sequences[0].matchLength = (1u << windowLog) - 32;
|
||||
sequences[0].rep = 0;
|
||||
{
|
||||
size_t i;
|
||||
for (i = 1; i < kNbSequences; ++i) {
|
||||
sequences[i].offset = (1u << windowLog) - (FUZ_rand(&seed) % 8);
|
||||
sequences[i].litLength = FUZ_rand(&seed) & 7;
|
||||
sequences[i].matchLength = 10 - sequences[i].litLength;
|
||||
sequences[i].rep = 0;
|
||||
}
|
||||
}
|
||||
|
||||
CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_checksumFlag, 1));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_minMatch, 3));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_validateSequences, 1));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_windowLog, windowLog));
|
||||
assert(srcSize <= kMaxSrcSize);
|
||||
cSize = ZSTD_compressSequences(zc, compressedBuffer, compressedBufferSize, sequences, kNbSequences, src, srcSize);
|
||||
CHECK_Z(cSize);
|
||||
CHECK_Z(ZSTD_DCtx_reset(zd, ZSTD_reset_session_and_parameters));
|
||||
CHECK_Z(ZSTD_DCtx_setParameter(zd, ZSTD_d_windowLogMax, windowLog))
|
||||
{
|
||||
ZSTD_inBuffer in = {compressedBuffer, cSize, 0};
|
||||
size_t decompressedBytes = 0;
|
||||
for (;;) {
|
||||
ZSTD_outBuffer out = {decodedBuffer, decodedBufferSize, 0};
|
||||
size_t const ret = ZSTD_decompressStream(zd, &out, &in);
|
||||
CHECK_Z(ret);
|
||||
CHECK(decompressedBytes + out.pos > srcSize, "Output too large");
|
||||
CHECK(memcmp(out.dst, src + decompressedBytes, out.pos), "Corrupted");
|
||||
decompressedBytes += out.pos;
|
||||
if (ret == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
CHECK(decompressedBytes != srcSize, "Output wrong size");
|
||||
}
|
||||
}
|
||||
free(sequences);
|
||||
free(src);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
/* Overlen overwriting window data bug */
|
||||
DISPLAYLEVEL(3, "test%3i : wildcopy doesn't overwrite potential match data : ", testNb++);
|
||||
{ /* This test has a window size of 1024 bytes and consists of 3 blocks:
|
||||
@@ -1777,6 +1856,445 @@ static int basicUnitTests(U32 seed, double compressibility)
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : External matchfinder API: ", testNb++);
|
||||
{
|
||||
size_t const dstBufSize = ZSTD_compressBound(CNBufferSize);
|
||||
BYTE* const dstBuf = (BYTE*)malloc(ZSTD_compressBound(dstBufSize));
|
||||
size_t const checkBufSize = CNBufferSize;
|
||||
BYTE* const checkBuf = (BYTE*)malloc(checkBufSize);
|
||||
int enableFallback;
|
||||
EMF_testCase externalMatchState;
|
||||
|
||||
CHECK(dstBuf == NULL || checkBuf == NULL, "allocation failed");
|
||||
|
||||
CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters));
|
||||
|
||||
/* Reference external matchfinder outside the test loop to
|
||||
* check that the reference is preserved across compressions */
|
||||
ZSTD_registerExternalMatchFinder(zc, &externalMatchState, zstreamExternalMatchFinder);
|
||||
|
||||
for (enableFallback = 0; enableFallback <= 1; enableFallback++) {
|
||||
size_t testCaseId;
|
||||
size_t const numTestCases = 9;
|
||||
|
||||
EMF_testCase const testCases[] = {
|
||||
EMF_ONE_BIG_SEQ,
|
||||
EMF_LOTS_OF_SEQS,
|
||||
EMF_ZERO_SEQS,
|
||||
EMF_BIG_ERROR,
|
||||
EMF_SMALL_ERROR,
|
||||
EMF_INVALID_OFFSET,
|
||||
EMF_INVALID_MATCHLEN,
|
||||
EMF_INVALID_LITLEN,
|
||||
EMF_INVALID_LAST_LITS
|
||||
};
|
||||
|
||||
ZSTD_ErrorCode const errorCodes[] = {
|
||||
ZSTD_error_no_error,
|
||||
ZSTD_error_no_error,
|
||||
ZSTD_error_externalMatchFinder_failed,
|
||||
ZSTD_error_externalMatchFinder_failed,
|
||||
ZSTD_error_externalMatchFinder_failed,
|
||||
ZSTD_error_externalSequences_invalid,
|
||||
ZSTD_error_externalSequences_invalid,
|
||||
ZSTD_error_externalSequences_invalid,
|
||||
ZSTD_error_externalSequences_invalid
|
||||
};
|
||||
|
||||
for (testCaseId = 0; testCaseId < numTestCases; testCaseId++) {
|
||||
size_t res;
|
||||
|
||||
int const compressionShouldSucceed = (
|
||||
(errorCodes[testCaseId] == ZSTD_error_no_error) ||
|
||||
(enableFallback && errorCodes[testCaseId] == ZSTD_error_externalMatchFinder_failed)
|
||||
);
|
||||
|
||||
int const testWithSequenceValidation = (
|
||||
testCases[testCaseId] == EMF_INVALID_OFFSET
|
||||
);
|
||||
|
||||
externalMatchState = testCases[testCaseId];
|
||||
|
||||
ZSTD_CCtx_reset(zc, ZSTD_reset_session_only);
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_validateSequences, testWithSequenceValidation));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableMatchFinderFallback, enableFallback));
|
||||
res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize);
|
||||
|
||||
if (compressionShouldSucceed) {
|
||||
CHECK(ZSTD_isError(res), "EMF: Compression error: %s", ZSTD_getErrorName(res));
|
||||
CHECK_Z(ZSTD_decompress(checkBuf, checkBufSize, dstBuf, res));
|
||||
CHECK(memcmp(CNBuffer, checkBuf, CNBufferSize) != 0, "EMF: Corruption!");
|
||||
} else {
|
||||
CHECK(!ZSTD_isError(res), "EMF: Should have raised an error!");
|
||||
CHECK(
|
||||
ZSTD_getErrorCode(res) != errorCodes[testCaseId],
|
||||
"EMF: Wrong error code: %s", ZSTD_getErrorName(res)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/* Test compression with external matchfinder + empty src buffer */
|
||||
{
|
||||
size_t res;
|
||||
externalMatchState = EMF_ZERO_SEQS;
|
||||
ZSTD_CCtx_reset(zc, ZSTD_reset_session_only);
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableMatchFinderFallback, enableFallback));
|
||||
res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, 0);
|
||||
CHECK(ZSTD_isError(res), "EMF: Compression error: %s", ZSTD_getErrorName(res));
|
||||
CHECK(ZSTD_decompress(checkBuf, checkBufSize, dstBuf, res) != 0, "EMF: Empty src round trip failed!");
|
||||
}
|
||||
}
|
||||
|
||||
/* Test that reset clears the external matchfinder */
|
||||
CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters));
|
||||
externalMatchState = EMF_BIG_ERROR; /* ensure zstd will fail if the matchfinder wasn't cleared */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableMatchFinderFallback, 0));
|
||||
CHECK_Z(ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize));
|
||||
|
||||
/* Test that registering mFinder == NULL clears the external matchfinder */
|
||||
ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters);
|
||||
ZSTD_registerExternalMatchFinder(zc, &externalMatchState, zstreamExternalMatchFinder);
|
||||
externalMatchState = EMF_BIG_ERROR; /* ensure zstd will fail if the matchfinder wasn't cleared */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableMatchFinderFallback, 0));
|
||||
ZSTD_registerExternalMatchFinder(zc, NULL, NULL); /* clear the external matchfinder */
|
||||
CHECK_Z(ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize));
|
||||
|
||||
/* Test that external matchfinder doesn't interact with older APIs */
|
||||
ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters);
|
||||
ZSTD_registerExternalMatchFinder(zc, &externalMatchState, zstreamExternalMatchFinder);
|
||||
externalMatchState = EMF_BIG_ERROR; /* ensure zstd will fail if the matchfinder is used */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableMatchFinderFallback, 0));
|
||||
CHECK_Z(ZSTD_compressCCtx(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize, 3));
|
||||
|
||||
/* Test that compression returns the correct error with LDM */
|
||||
CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters));
|
||||
{
|
||||
size_t res;
|
||||
ZSTD_registerExternalMatchFinder(zc, &externalMatchState, zstreamExternalMatchFinder);
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_enable));
|
||||
res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize);
|
||||
CHECK(!ZSTD_isError(res), "EMF: Should have raised an error!");
|
||||
CHECK(
|
||||
ZSTD_getErrorCode(res) != ZSTD_error_parameter_combination_unsupported,
|
||||
"EMF: Wrong error code: %s", ZSTD_getErrorName(res)
|
||||
);
|
||||
}
|
||||
|
||||
#ifdef ZSTD_MULTITHREAD
|
||||
/* Test that compression returns the correct error with nbWorkers > 0 */
|
||||
CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters));
|
||||
{
|
||||
size_t res;
|
||||
ZSTD_registerExternalMatchFinder(zc, &externalMatchState, zstreamExternalMatchFinder);
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_nbWorkers, 1));
|
||||
res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize);
|
||||
CHECK(!ZSTD_isError(res), "EMF: Should have raised an error!");
|
||||
CHECK(
|
||||
ZSTD_getErrorCode(res) != ZSTD_error_parameter_combination_unsupported,
|
||||
"EMF: Wrong error code: %s", ZSTD_getErrorName(res)
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
free(dstBuf);
|
||||
free(checkBuf);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
|
||||
/* Test maxBlockSize cctx param functionality */
|
||||
DISPLAYLEVEL(3, "test%3i : Testing maxBlockSize PR#3418: ", testNb++);
|
||||
{
|
||||
ZSTD_CCtx* cctx = ZSTD_createCCtx();
|
||||
|
||||
/* Quick test to make sure maxBlockSize bounds are enforced */
|
||||
assert(ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, ZSTD_BLOCKSIZE_MAX_MIN - 1)));
|
||||
assert(ZSTD_isError(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, ZSTD_BLOCKSIZE_MAX + 1)));
|
||||
|
||||
/* Test maxBlockSize < windowSize and windowSize < maxBlockSize*/
|
||||
{
|
||||
size_t srcSize = 2 << 10;
|
||||
void* const src = CNBuffer;
|
||||
size_t dstSize = ZSTD_compressBound(srcSize);
|
||||
void* const dst1 = compressedBuffer;
|
||||
void* const dst2 = (BYTE*)compressedBuffer + dstSize;
|
||||
size_t size1, size2;
|
||||
void* const checkBuf = malloc(srcSize);
|
||||
memset(src, 'x', srcSize);
|
||||
|
||||
/* maxBlockSize = 1KB */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, 1u << 10));
|
||||
size1 = ZSTD_compress2(cctx, dst1, dstSize, src, srcSize);
|
||||
|
||||
if (ZSTD_isError(size1)) goto _output_error;
|
||||
CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst1, size1));
|
||||
CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!");
|
||||
|
||||
/* maxBlockSize = 3KB */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, 3u << 10));
|
||||
size2 = ZSTD_compress2(cctx, dst2, dstSize, src, srcSize);
|
||||
|
||||
if (ZSTD_isError(size2)) goto _output_error;
|
||||
CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst2, size2));
|
||||
CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!");
|
||||
|
||||
assert(size1 - size2 == 4); /* We add another RLE block with header + character */
|
||||
assert(memcmp(dst1, dst2, size2) != 0); /* Compressed output should not be equal */
|
||||
|
||||
/* maxBlockSize = 1KB, windowLog = 10 */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, 1u << 10));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, 10));
|
||||
size1 = ZSTD_compress2(cctx, dst1, dstSize, src, srcSize);
|
||||
|
||||
if (ZSTD_isError(size1)) goto _output_error;
|
||||
CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst1, size1));
|
||||
CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!");
|
||||
|
||||
/* maxBlockSize = 3KB, windowLog = 10 */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, 3u << 10));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, 10));
|
||||
size2 = ZSTD_compress2(cctx, dst2, dstSize, src, srcSize);
|
||||
|
||||
if (ZSTD_isError(size2)) goto _output_error;
|
||||
CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst2, size2));
|
||||
CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!");
|
||||
|
||||
assert(size1 == size2);
|
||||
assert(memcmp(dst1, dst2, size1) == 0); /* Compressed output should be equal */
|
||||
|
||||
free(checkBuf);
|
||||
}
|
||||
|
||||
ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters);
|
||||
|
||||
/* Test maxBlockSize = 0 is valid */
|
||||
{ size_t srcSize = 256 << 10;
|
||||
void* const src = CNBuffer;
|
||||
size_t dstSize = ZSTD_compressBound(srcSize);
|
||||
void* const dst1 = compressedBuffer;
|
||||
void* const dst2 = (BYTE*)compressedBuffer + dstSize;
|
||||
size_t size1, size2;
|
||||
void* const checkBuf = malloc(srcSize);
|
||||
|
||||
/* maxBlockSize = 0 */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, 0));
|
||||
size1 = ZSTD_compress2(cctx, dst1, dstSize, src, srcSize);
|
||||
|
||||
if (ZSTD_isError(size1)) goto _output_error;
|
||||
CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst1, size1));
|
||||
CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!");
|
||||
|
||||
/* maxBlockSize = ZSTD_BLOCKSIZE_MAX */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_maxBlockSize, ZSTD_BLOCKSIZE_MAX));
|
||||
size2 = ZSTD_compress2(cctx, dst2, dstSize, src, srcSize);
|
||||
|
||||
if (ZSTD_isError(size2)) goto _output_error;
|
||||
CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst2, size2));
|
||||
CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!");
|
||||
|
||||
assert(size1 == size2);
|
||||
assert(memcmp(dst1, dst2, size1) == 0); /* Compressed output should be equal */
|
||||
free(checkBuf);
|
||||
}
|
||||
ZSTD_freeCCtx(cctx);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
/* Test Sequence Validation */
|
||||
DISPLAYLEVEL(3, "test%3i : Testing sequence validation: ", testNb++);
|
||||
{
|
||||
ZSTD_CCtx* cctx = ZSTD_createCCtx();
|
||||
|
||||
/* Test minMatch >= 4, matchLength < 4 */
|
||||
{
|
||||
size_t srcSize = 11;
|
||||
void* const src = CNBuffer;
|
||||
size_t dstSize = ZSTD_compressBound(srcSize);
|
||||
void* const dst = compressedBuffer;
|
||||
size_t const kNbSequences = 4;
|
||||
ZSTD_Sequence* sequences = malloc(sizeof(ZSTD_Sequence) * kNbSequences);
|
||||
|
||||
memset(src, 'x', srcSize);
|
||||
|
||||
sequences[0] = (ZSTD_Sequence) {1, 1, 3, 0};
|
||||
sequences[1] = (ZSTD_Sequence) {1, 0, 3, 0};
|
||||
sequences[2] = (ZSTD_Sequence) {1, 0, 3, 0};
|
||||
sequences[3] = (ZSTD_Sequence) {0, 1, 0, 0};
|
||||
|
||||
/* Test with sequence validation */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 5));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_explicitBlockDelimiters));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 1));
|
||||
|
||||
cSize = ZSTD_compressSequences(cctx, dst, dstSize,
|
||||
sequences, kNbSequences,
|
||||
src, srcSize);
|
||||
|
||||
CHECK(!ZSTD_isError(cSize), "Should throw an error"); /* maxNbSeq is too small and an assert will fail */
|
||||
CHECK(ZSTD_getErrorCode(cSize) != ZSTD_error_externalSequences_invalid, "Wrong error code: %s", ZSTD_getErrorName(cSize)); /* fails sequence validation */
|
||||
|
||||
ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters);
|
||||
|
||||
/* Test without sequence validation */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 5));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_explicitBlockDelimiters));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 0));
|
||||
|
||||
cSize = ZSTD_compressSequences(cctx, dst, dstSize,
|
||||
sequences, kNbSequences,
|
||||
src, srcSize);
|
||||
|
||||
CHECK(!ZSTD_isError(cSize), "Should throw an error"); /* maxNbSeq is too small and an assert will fail */
|
||||
CHECK(ZSTD_getErrorCode(cSize) != ZSTD_error_externalSequences_invalid, "Wrong error code: %s", ZSTD_getErrorName(cSize)); /* fails sequence validation */
|
||||
|
||||
free(sequences);
|
||||
}
|
||||
|
||||
ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters);
|
||||
|
||||
|
||||
/* Test with no block delim */
|
||||
{
|
||||
size_t srcSize = 4;
|
||||
void* const src = CNBuffer;
|
||||
size_t dstSize = ZSTD_compressBound(srcSize);
|
||||
void* const dst = compressedBuffer;
|
||||
size_t const kNbSequences = 1;
|
||||
ZSTD_Sequence* sequences = malloc(sizeof(ZSTD_Sequence) * kNbSequences);
|
||||
void* const checkBuf = malloc(srcSize);
|
||||
|
||||
memset(src, 'x', srcSize);
|
||||
|
||||
sequences[0] = (ZSTD_Sequence) {1, 1, 3, 0};
|
||||
|
||||
/* Test with sequence validation */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 3));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_noBlockDelimiters));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 1));
|
||||
|
||||
cSize = ZSTD_compressSequences(cctx, dst, dstSize,
|
||||
sequences, kNbSequences,
|
||||
src, srcSize);
|
||||
|
||||
CHECK(ZSTD_isError(cSize), "Should not throw an error");
|
||||
CHECK_Z(ZSTD_decompress(checkBuf, srcSize, dst, cSize));
|
||||
CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!");
|
||||
|
||||
free(sequences);
|
||||
free(checkBuf);
|
||||
}
|
||||
|
||||
ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters);
|
||||
|
||||
{ /* Test case with two additional sequences */
|
||||
size_t srcSize = 19;
|
||||
void* const src = CNBuffer;
|
||||
size_t dstSize = ZSTD_compressBound(srcSize);
|
||||
void* const dst = compressedBuffer;
|
||||
size_t const kNbSequences = 7;
|
||||
ZSTD_Sequence* sequences = malloc(sizeof(ZSTD_Sequence) * kNbSequences);
|
||||
|
||||
memset(src, 'x', srcSize);
|
||||
|
||||
sequences[0] = (ZSTD_Sequence) {1, 1, 3, 0};
|
||||
sequences[1] = (ZSTD_Sequence) {1, 0, 3, 0};
|
||||
sequences[2] = (ZSTD_Sequence) {1, 0, 3, 0};
|
||||
sequences[3] = (ZSTD_Sequence) {1, 0, 3, 0};
|
||||
sequences[4] = (ZSTD_Sequence) {1, 0, 3, 0};
|
||||
sequences[5] = (ZSTD_Sequence) {1, 0, 3, 0};
|
||||
sequences[6] = (ZSTD_Sequence) {0, 0, 0, 0};
|
||||
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 5));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_explicitBlockDelimiters));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 1));
|
||||
|
||||
cSize = ZSTD_compressSequences(cctx, dst, dstSize,
|
||||
sequences, kNbSequences,
|
||||
src, srcSize);
|
||||
|
||||
CHECK(!ZSTD_isError(cSize), "Should throw an error"); /* maxNbSeq is too small and an assert will fail */
|
||||
CHECK(ZSTD_getErrorCode(cSize) != ZSTD_error_externalSequences_invalid, "Wrong error code: %s", ZSTD_getErrorName(cSize)); /* fails sequence validation */
|
||||
|
||||
ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters);
|
||||
|
||||
/* Test without sequence validation */
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, 5));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_explicitBlockDelimiters));
|
||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 0));
|
||||
|
||||
cSize = ZSTD_compressSequences(cctx, dst, dstSize,
|
||||
sequences, kNbSequences,
|
||||
src, srcSize);
|
||||
|
||||
CHECK(!ZSTD_isError(cSize), "Should throw an error"); /* maxNbSeq is too small and an assert will fail */
|
||||
CHECK(ZSTD_getErrorCode(cSize) != ZSTD_error_externalSequences_invalid, "Wrong error code: %s", ZSTD_getErrorName(cSize)); /* fails sequence validation */
|
||||
|
||||
free(sequences);
|
||||
}
|
||||
ZSTD_freeCCtx(cctx);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
|
||||
DISPLAYLEVEL(3, "test%3i : Testing large offset with small window size: ", testNb++);
|
||||
{
|
||||
ZSTD_CCtx* cctx = ZSTD_createCCtx();
|
||||
ZSTD_DCtx* dctx = ZSTD_createDCtx();
|
||||
|
||||
/* Test large offset, small window size*/
|
||||
{
|
||||
size_t srcSize = 21;
|
||||
void* const src = CNBuffer;
|
||||
size_t dstSize = ZSTD_compressBound(srcSize);
|
||||
void* const dst = compressedBuffer;
|
||||
size_t const kNbSequences = 4;
|
||||
ZSTD_Sequence* sequences = malloc(sizeof(ZSTD_Sequence) * kNbSequences);
|
||||
void* const checkBuf = malloc(srcSize);
|
||||
const size_t largeDictSize = 1 << 25;
|
||||
ZSTD_CDict* cdict = NULL;
|
||||
ZSTD_DDict* ddict = NULL;
|
||||
|
||||
/* Generate large dictionary */
|
||||
void* dictBuffer = calloc(largeDictSize, 1);
|
||||
ZSTD_compressionParameters cParams = ZSTD_getCParams(1, srcSize, largeDictSize);
|
||||
cParams.minMatch = ZSTD_MINMATCH_MIN;
|
||||
cParams.hashLog = ZSTD_HASHLOG_MIN;
|
||||
cParams.chainLog = ZSTD_CHAINLOG_MIN;
|
||||
|
||||
cdict = ZSTD_createCDict_advanced(dictBuffer, largeDictSize, ZSTD_dlm_byRef, ZSTD_dct_rawContent, cParams, ZSTD_defaultCMem);
|
||||
ddict = ZSTD_createDDict_advanced(dictBuffer, largeDictSize, ZSTD_dlm_byRef, ZSTD_dct_rawContent, ZSTD_defaultCMem);
|
||||
|
||||
ZSTD_CCtx_refCDict(cctx, cdict);
|
||||
ZSTD_DCtx_refDDict(dctx, ddict);
|
||||
|
||||
sequences[0] = (ZSTD_Sequence) {3, 3, 3, 0};
|
||||
sequences[1] = (ZSTD_Sequence) {1 << 25, 0, 3, 0};
|
||||
sequences[2] = (ZSTD_Sequence) {1 << 25, 0, 9, 0};
|
||||
sequences[3] = (ZSTD_Sequence) {3, 0, 3, 0};
|
||||
|
||||
cSize = ZSTD_compressSequences(cctx, dst, dstSize,
|
||||
sequences, kNbSequences,
|
||||
src, srcSize);
|
||||
|
||||
CHECK(ZSTD_isError(cSize), "Should not throw an error");
|
||||
|
||||
{
|
||||
size_t dSize = ZSTD_decompressDCtx(dctx, checkBuf, srcSize, dst, cSize);
|
||||
CHECK(ZSTD_isError(dSize), "Should not throw an error");
|
||||
CHECK(memcmp(src, checkBuf, srcSize) != 0, "Corruption!");
|
||||
}
|
||||
|
||||
free(sequences);
|
||||
free(checkBuf);
|
||||
free(dictBuffer);
|
||||
ZSTD_freeCDict(cdict);
|
||||
ZSTD_freeDDict(ddict);
|
||||
}
|
||||
ZSTD_freeCCtx(cctx);
|
||||
ZSTD_freeDCtx(dctx);
|
||||
}
|
||||
DISPLAYLEVEL(3, "OK \n");
|
||||
|
||||
_end:
|
||||
FUZ_freeDictionary(dictionary);
|
||||
ZSTD_freeCStream(zc);
|
||||
@@ -2444,6 +2962,9 @@ static int fuzzerTests_newAPI(U32 seed, int nbTests, int startTest,
|
||||
CHECK(badParameters(zc, savedParams), "CCtx params are wrong");
|
||||
|
||||
/* multi - fragments decompression test */
|
||||
if (FUZ_rand(&lseed) & 1) {
|
||||
CHECK_Z(ZSTD_DCtx_reset(zd, ZSTD_reset_session_and_parameters));
|
||||
}
|
||||
if (!dictSize /* don't reset if dictionary : could be different */ && (FUZ_rand(&lseed) & 1)) {
|
||||
DISPLAYLEVEL(5, "resetting DCtx (dict:%p) \n", (void const*)dict);
|
||||
CHECK_Z( ZSTD_resetDStream(zd) );
|
||||
@@ -2452,6 +2973,9 @@ static int fuzzerTests_newAPI(U32 seed, int nbTests, int startTest,
|
||||
DISPLAYLEVEL(5, "using dictionary of size %zu \n", dictSize);
|
||||
CHECK_Z( ZSTD_initDStream_usingDict(zd, dict, dictSize) );
|
||||
}
|
||||
if (FUZ_rand(&lseed) & 1) {
|
||||
CHECK_Z(ZSTD_DCtx_setParameter(zd, ZSTD_d_disableHuffmanAssembly, FUZ_rand(&lseed) & 1));
|
||||
}
|
||||
{ size_t decompressionResult = 1;
|
||||
ZSTD_inBuffer inBuff = { cBuffer, cSize, 0 };
|
||||
ZSTD_outBuffer outBuff= { dstBuffer, dstBufferSize, 0 };
|
||||
@@ -2493,7 +3017,14 @@ static int fuzzerTests_newAPI(U32 seed, int nbTests, int startTest,
|
||||
} }
|
||||
|
||||
/* try decompression on noisy data */
|
||||
CHECK_Z( ZSTD_initDStream(zd_noise) ); /* note : no dictionary */
|
||||
if (FUZ_rand(&lseed) & 1) {
|
||||
CHECK_Z(ZSTD_DCtx_reset(zd_noise, ZSTD_reset_session_and_parameters));
|
||||
} else {
|
||||
CHECK_Z(ZSTD_DCtx_reset(zd_noise, ZSTD_reset_session_only));
|
||||
}
|
||||
if (FUZ_rand(&lseed) & 1) {
|
||||
CHECK_Z(ZSTD_DCtx_setParameter(zd_noise, ZSTD_d_disableHuffmanAssembly, FUZ_rand(&lseed) & 1));
|
||||
}
|
||||
{ ZSTD_inBuffer inBuff = { cBuffer, cSize, 0 };
|
||||
ZSTD_outBuffer outBuff= { dstBuffer, dstBufferSize, 0 };
|
||||
while (outBuff.pos < dstBufferSize) {
|
||||
@@ -2576,6 +3107,7 @@ int main(int argc, const char** argv)
|
||||
|
||||
if (!strcmp(argument, "--newapi")) { selected_api=advanced_api; testNb += !testNb; continue; }
|
||||
if (!strcmp(argument, "--no-big-tests")) { bigTests=0; continue; }
|
||||
if (!strcmp(argument, "--big-tests")) { bigTests=1; continue; }
|
||||
|
||||
argument++;
|
||||
while (*argument!=0) {
|
||||
@@ -2677,7 +3209,7 @@ int main(int argc, const char** argv)
|
||||
if (nbTests<=0) nbTests=1;
|
||||
|
||||
if (testNb==0) {
|
||||
result = basicUnitTests(0, ((double)proba) / 100); /* constant seed for predictability */
|
||||
result = basicUnitTests(0, ((double)proba) / 100, bigTests); /* constant seed for predictability */
|
||||
}
|
||||
|
||||
if (!result) {
|
||||
|
||||
Reference in New Issue
Block a user