xref: /aosp_15_r20/external/zstd/tests/playTests.sh (revision 01826a4963a0d8a59bc3812d29bdf0fb76416722)
1*01826a49SYabin Cui#!/bin/sh
2*01826a49SYabin Cui
3*01826a49SYabin Cuiset -e # exit immediately on error
4*01826a49SYabin Cui# set -x # print commands before execution (debug)
5*01826a49SYabin Cui
6*01826a49SYabin Cuiunset ZSTD_CLEVEL
7*01826a49SYabin Cuiunset ZSTD_NBTHREADS
8*01826a49SYabin Cui
9*01826a49SYabin Cui
10*01826a49SYabin Cuidie() {
11*01826a49SYabin Cui    println "$@" 1>&2
12*01826a49SYabin Cui    exit 1
13*01826a49SYabin Cui}
14*01826a49SYabin Cui
15*01826a49SYabin Cuidatagen() {
16*01826a49SYabin Cui    "$DATAGEN_BIN" "$@"
17*01826a49SYabin Cui}
18*01826a49SYabin Cui
19*01826a49SYabin Cuizstd() {
20*01826a49SYabin Cui    if [ -z "$EXE_PREFIX" ]; then
21*01826a49SYabin Cui        "$ZSTD_BIN" "$@"
22*01826a49SYabin Cui    else
23*01826a49SYabin Cui        "$EXE_PREFIX" "$ZSTD_BIN" "$@"
24*01826a49SYabin Cui    fi
25*01826a49SYabin Cui}
26*01826a49SYabin Cui
27*01826a49SYabin CuisudoZstd() {
28*01826a49SYabin Cui    if [ -z "$EXE_PREFIX" ]; then
29*01826a49SYabin Cui        sudo "$ZSTD_BIN" "$@"
30*01826a49SYabin Cui    else
31*01826a49SYabin Cui        sudo "$EXE_PREFIX" "$ZSTD_BIN" "$@"
32*01826a49SYabin Cui    fi
33*01826a49SYabin Cui}
34*01826a49SYabin Cui
35*01826a49SYabin CuiroundTripTest() {
36*01826a49SYabin Cui    if [ -n "$3" ]; then
37*01826a49SYabin Cui        cLevel="$3"
38*01826a49SYabin Cui        proba="$2"
39*01826a49SYabin Cui    else
40*01826a49SYabin Cui        cLevel="$2"
41*01826a49SYabin Cui        proba=""
42*01826a49SYabin Cui    fi
43*01826a49SYabin Cui    if [ -n "$4" ]; then
44*01826a49SYabin Cui        dLevel="$4"
45*01826a49SYabin Cui    else
46*01826a49SYabin Cui        dLevel="$cLevel"
47*01826a49SYabin Cui    fi
48*01826a49SYabin Cui
49*01826a49SYabin Cui    rm -f tmp1 tmp2
50*01826a49SYabin Cui    println "roundTripTest: datagen $1 $proba | zstd -v$cLevel | zstd -d$dLevel"
51*01826a49SYabin Cui    datagen $1 $proba | $MD5SUM > tmp1
52*01826a49SYabin Cui    datagen $1 $proba | zstd --ultra -v$cLevel | zstd -d$dLevel  | $MD5SUM > tmp2
53*01826a49SYabin Cui    $DIFF -q tmp1 tmp2
54*01826a49SYabin Cui}
55*01826a49SYabin Cui
56*01826a49SYabin CuifileRoundTripTest() {
57*01826a49SYabin Cui    if [ -n "$3" ]; then
58*01826a49SYabin Cui        local_c="$3"
59*01826a49SYabin Cui        local_p="$2"
60*01826a49SYabin Cui    else
61*01826a49SYabin Cui        local_c="$2"
62*01826a49SYabin Cui        local_p=""
63*01826a49SYabin Cui    fi
64*01826a49SYabin Cui    if [ -n "$4" ]; then
65*01826a49SYabin Cui        local_d="$4"
66*01826a49SYabin Cui    else
67*01826a49SYabin Cui        local_d="$local_c"
68*01826a49SYabin Cui    fi
69*01826a49SYabin Cui
70*01826a49SYabin Cui    rm -f tmp.zst tmp.md5.1 tmp.md5.2
71*01826a49SYabin Cui    println "fileRoundTripTest: datagen $1 $local_p > tmp && zstd -v$local_c -c tmp | zstd -d$local_d"
72*01826a49SYabin Cui    datagen $1 $local_p > tmp
73*01826a49SYabin Cui    < tmp $MD5SUM > tmp.md5.1
74*01826a49SYabin Cui    zstd --ultra -v$local_c -c tmp | zstd -d$local_d | $MD5SUM > tmp.md5.2
75*01826a49SYabin Cui    $DIFF -q tmp.md5.1 tmp.md5.2
76*01826a49SYabin Cui}
77*01826a49SYabin Cui
78*01826a49SYabin CuitruncateLastByte() {
79*01826a49SYabin Cui    dd bs=1 count=$(($(wc -c < "$1") - 1)) if="$1"
80*01826a49SYabin Cui}
81*01826a49SYabin Cui
82*01826a49SYabin Cuiprintln() {
83*01826a49SYabin Cui    printf '%b\n' "${*}"
84*01826a49SYabin Cui}
85*01826a49SYabin Cui
86*01826a49SYabin Cuiif [ -z "${size}" ]; then
87*01826a49SYabin Cui    size=
88*01826a49SYabin Cuielse
89*01826a49SYabin Cui    size=${size}
90*01826a49SYabin Cuifi
91*01826a49SYabin Cui
92*01826a49SYabin CuiSCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
93*01826a49SYabin CuiPRGDIR="$SCRIPT_DIR/../programs"
94*01826a49SYabin CuiTESTDIR="$SCRIPT_DIR/../tests"
95*01826a49SYabin CuiUNAME=${UNAME:-$(uname)}
96*01826a49SYabin CuiGREP=${GREP:-grep}
97*01826a49SYabin Cui
98*01826a49SYabin Cuicase "$UNAME" in
99*01826a49SYabin Cui  SunOS) DIFF=${DIFF:-gdiff} ;;
100*01826a49SYabin Cui  *) DIFF=${DIFF:-diff} ;;
101*01826a49SYabin Cuiesac
102*01826a49SYabin Cui
103*01826a49SYabin CuidetectedTerminal=false
104*01826a49SYabin Cuiif [ -t 0 ] && [ -t 1 ]
105*01826a49SYabin Cuithen
106*01826a49SYabin Cui    detectedTerminal=true
107*01826a49SYabin Cuifi
108*01826a49SYabin CuiisTerminal=${isTerminal:-$detectedTerminal}
109*01826a49SYabin Cui
110*01826a49SYabin CuiisWindows=false
111*01826a49SYabin CuiINTOVOID="/dev/null"
112*01826a49SYabin Cuicase "$UNAME" in
113*01826a49SYabin Cui  GNU) DEVDEVICE="/dev/random" ;;
114*01826a49SYabin Cui  *) DEVDEVICE="/dev/zero" ;;
115*01826a49SYabin Cuiesac
116*01826a49SYabin Cuicase "$OS" in
117*01826a49SYabin Cui  Windows*)
118*01826a49SYabin Cui    isWindows=true
119*01826a49SYabin Cui    INTOVOID="NUL"
120*01826a49SYabin Cui    DEVDEVICE="NUL"
121*01826a49SYabin Cui    ;;
122*01826a49SYabin Cuiesac
123*01826a49SYabin Cui
124*01826a49SYabin Cuicase "$UNAME" in
125*01826a49SYabin Cui  Darwin) MD5SUM="md5 -r" ;;
126*01826a49SYabin Cui  FreeBSD) MD5SUM="gmd5sum" ;;
127*01826a49SYabin Cui  NetBSD) MD5SUM="md5 -n" ;;
128*01826a49SYabin Cui  OpenBSD) MD5SUM="md5" ;;
129*01826a49SYabin Cui  *) MD5SUM="md5sum" ;;
130*01826a49SYabin Cuiesac
131*01826a49SYabin Cui
132*01826a49SYabin CuiMTIME="stat -c %Y"
133*01826a49SYabin Cuicase "$UNAME" in
134*01826a49SYabin Cui    Darwin | FreeBSD | OpenBSD | NetBSD) MTIME="stat -f %m" ;;
135*01826a49SYabin Cuiesac
136*01826a49SYabin Cui
137*01826a49SYabin CuiassertSameMTime() {
138*01826a49SYabin Cui    MT1=$($MTIME "$1")
139*01826a49SYabin Cui    MT2=$($MTIME "$2")
140*01826a49SYabin Cui    echo MTIME $MT1 $MT2
141*01826a49SYabin Cui    [ "$MT1" = "$MT2" ] || die "mtime on $1 doesn't match mtime on $2 ($MT1 != $MT2)"
142*01826a49SYabin Cui}
143*01826a49SYabin Cui
144*01826a49SYabin CuiGET_PERMS="stat -c %a"
145*01826a49SYabin Cuicase "$UNAME" in
146*01826a49SYabin Cui    Darwin | FreeBSD | OpenBSD | NetBSD) GET_PERMS="stat -f %Lp" ;;
147*01826a49SYabin Cuiesac
148*01826a49SYabin Cui
149*01826a49SYabin CuiassertFilePermissions() {
150*01826a49SYabin Cui    STAT1=$($GET_PERMS "$1")
151*01826a49SYabin Cui    STAT2=$2
152*01826a49SYabin Cui    [ "$STAT1" = "$STAT2" ] || die "permissions on $1 don't match expected ($STAT1 != $STAT2)"
153*01826a49SYabin Cui}
154*01826a49SYabin Cui
155*01826a49SYabin CuiassertSamePermissions() {
156*01826a49SYabin Cui    STAT1=$($GET_PERMS "$1")
157*01826a49SYabin Cui    STAT2=$($GET_PERMS "$2")
158*01826a49SYabin Cui    [ "$STAT1" = "$STAT2" ] || die "permissions on $1 don't match those on $2 ($STAT1 != $STAT2)"
159*01826a49SYabin Cui}
160*01826a49SYabin Cui
161*01826a49SYabin Cui
162*01826a49SYabin Cui# check if ZSTD_BIN is defined. if not, use the default value
163*01826a49SYabin Cuiif [ -z "${ZSTD_BIN}" ]; then
164*01826a49SYabin Cui  println "\nZSTD_BIN is not set. Using the default value..."
165*01826a49SYabin Cui  ZSTD_BIN="$PRGDIR/zstd"
166*01826a49SYabin Cuifi
167*01826a49SYabin Cui
168*01826a49SYabin Cui# check if DATAGEN_BIN is defined. if not, use the default value
169*01826a49SYabin Cuiif [ -z "${DATAGEN_BIN}" ]; then
170*01826a49SYabin Cui  println "\nDATAGEN_BIN is not set. Using the default value..."
171*01826a49SYabin Cui  DATAGEN_BIN="$TESTDIR/datagen"
172*01826a49SYabin Cuifi
173*01826a49SYabin Cui
174*01826a49SYabin Cui# Why was this line here ? Generates a strange ZSTD_BIN when EXE_PREFIX is non empty
175*01826a49SYabin Cui# ZSTD_BIN="$EXE_PREFIX$ZSTD_BIN"
176*01826a49SYabin Cui
177*01826a49SYabin Cui# assertions
178*01826a49SYabin Cui[ -n "$ZSTD_BIN" ] || die "zstd not found at $ZSTD_BIN! \n Please define ZSTD_BIN pointing to the zstd binary. You might also consider rebuilding zstd following the instructions in README.md"
179*01826a49SYabin Cui[ -n "$DATAGEN_BIN" ] || die "datagen not found at $DATAGEN_BIN! \n Please define DATAGEN_BIN pointing to the datagen binary. You might also consider rebuilding zstd tests following the instructions in README.md. "
180*01826a49SYabin Cuiprintln "\nStarting playTests.sh isWindows=$isWindows EXE_PREFIX='$EXE_PREFIX' ZSTD_BIN='$ZSTD_BIN' DATAGEN_BIN='$DATAGEN_BIN'"
181*01826a49SYabin Cui
182*01826a49SYabin Cuiif echo hello | zstd -v -T2 2>&1 > $INTOVOID | $GREP -q 'multi-threading is disabled'
183*01826a49SYabin Cuithen
184*01826a49SYabin Cui    hasMT=""
185*01826a49SYabin Cuielse
186*01826a49SYabin Cui    hasMT="true"
187*01826a49SYabin Cuifi
188*01826a49SYabin Cui
189*01826a49SYabin Cui
190*01826a49SYabin Cuizstd -vvV
191*01826a49SYabin Cui
192*01826a49SYabin Cuiprintln "\n===>  simple tests "
193*01826a49SYabin Cui
194*01826a49SYabin Cuidatagen > tmp
195*01826a49SYabin Cuizstd -h
196*01826a49SYabin Cuizstd -H
197*01826a49SYabin Cuizstd -V
198*01826a49SYabin Cuiprintln "test : basic compression "
199*01826a49SYabin Cuizstd -f tmp                      # trivial compression case, creates tmp.zst
200*01826a49SYabin Cuizstd -f -z tmp
201*01826a49SYabin Cuizstd -f -k tmp
202*01826a49SYabin Cuizstd -f -C tmp
203*01826a49SYabin Cuiprintln "test : basic decompression"
204*01826a49SYabin Cuizstd -df tmp.zst                 # trivial decompression case (overwrites tmp)
205*01826a49SYabin Cuiprintln "test : too large compression level => auto-fix"
206*01826a49SYabin Cuizstd -99 -f tmp  # too large compression level, automatic sized down
207*01826a49SYabin Cuizstd -5000000000 -f tmp && die "too large numeric value : must fail"
208*01826a49SYabin Cuiprintln "test : --fast aka negative compression levels"
209*01826a49SYabin Cuizstd --fast -f tmp  # == -1
210*01826a49SYabin Cuizstd --fast=3 -f tmp  # == -3
211*01826a49SYabin Cuizstd --fast=200000 -f tmp  # too low compression level, automatic fixed
212*01826a49SYabin Cuizstd --fast=5000000000 -f tmp && die "too large numeric value : must fail"
213*01826a49SYabin Cuizstd -c --fast=0 tmp > $INTOVOID && die "--fast must not accept value 0"
214*01826a49SYabin Cuiprintln "test : too large numeric argument"
215*01826a49SYabin Cuizstd --fast=9999999999 -f tmp  && die "should have refused numeric value"
216*01826a49SYabin Cuiprintln "test : set compression level with environment variable ZSTD_CLEVEL"
217*01826a49SYabin Cui
218*01826a49SYabin CuiZSTD_CLEVEL=12  zstd -f tmp # positive compression level
219*01826a49SYabin CuiZSTD_CLEVEL=-12 zstd -f tmp # negative compression level
220*01826a49SYabin CuiZSTD_CLEVEL=+12 zstd -f tmp # valid: verbose '+' sign
221*01826a49SYabin CuiZSTD_CLEVEL=''  zstd -f tmp # empty env var, warn and revert to default setting
222*01826a49SYabin CuiZSTD_CLEVEL=-   zstd -f tmp # malformed env var, warn and revert to default setting
223*01826a49SYabin CuiZSTD_CLEVEL=a   zstd -f tmp # malformed env var, warn and revert to default setting
224*01826a49SYabin CuiZSTD_CLEVEL=+a  zstd -f tmp # malformed env var, warn and revert to default setting
225*01826a49SYabin CuiZSTD_CLEVEL=3a7 zstd -f tmp # malformed env var, warn and revert to default setting
226*01826a49SYabin CuiZSTD_CLEVEL=50000000000 zstd -f tmp # numeric value too large, warn and revert to default setting
227*01826a49SYabin Cuiprintln "test : override ZSTD_CLEVEL with command line option"
228*01826a49SYabin CuiZSTD_CLEVEL=12  zstd --fast=3 -f tmp # overridden by command line option
229*01826a49SYabin Cui
230*01826a49SYabin Cui# temporary envvar changes in the above tests would actually persist in macos /bin/sh
231*01826a49SYabin Cuiunset ZSTD_CLEVEL
232*01826a49SYabin Cui
233*01826a49SYabin Cui
234*01826a49SYabin Cuiprintln "test : compress to stdout"
235*01826a49SYabin Cuizstd tmp -c > tmpCompressed
236*01826a49SYabin Cuizstd tmp --stdout > tmpCompressed       # long command format
237*01826a49SYabin Cui
238*01826a49SYabin Cuiprintln "test : compress to named file (-o)"
239*01826a49SYabin Cuirm -f tmpCompressed
240*01826a49SYabin Cuizstd tmp -o tmpCompressed
241*01826a49SYabin Cuitest -f tmpCompressed   # file must be created
242*01826a49SYabin Cui
243*01826a49SYabin Cuiprintln "test : force write, correct order"
244*01826a49SYabin Cuizstd tmp -fo tmpCompressed
245*01826a49SYabin Cui
246*01826a49SYabin Cuiprintln "test : -c + -o : last one wins"
247*01826a49SYabin Cuirm -f tmpOut
248*01826a49SYabin Cuizstd tmp -c > tmpCompressed -o tmpOut
249*01826a49SYabin Cuitest -f tmpOut   # file must be created
250*01826a49SYabin Cuirm -f tmpCompressed
251*01826a49SYabin Cuizstd tmp -o tmpOut -c > tmpCompressed
252*01826a49SYabin Cuitest -f tmpCompressed   # file must be created
253*01826a49SYabin Cui
254*01826a49SYabin Cuiprintln "test : forgotten argument"
255*01826a49SYabin Cuicp tmp tmp2
256*01826a49SYabin Cuizstd tmp2 -fo && die "-o must be followed by filename "
257*01826a49SYabin Cuiprintln "test : implied stdout when input is stdin"
258*01826a49SYabin Cuiprintln bob | zstd | zstd -d
259*01826a49SYabin Cuiif [ "$isTerminal" = true ]; then
260*01826a49SYabin Cuiprintln "test : compressed data to terminal"
261*01826a49SYabin Cuiprintln bob | zstd && die "should have refused : compressed data to terminal"
262*01826a49SYabin Cuiprintln "test : compressed data from terminal (a hang here is a test fail, zstd is wrongly waiting on data from terminal)"
263*01826a49SYabin Cuizstd -d > $INTOVOID && die "should have refused : compressed data from terminal"
264*01826a49SYabin Cuifi
265*01826a49SYabin Cuiprintln "test : null-length file roundtrip"
266*01826a49SYabin Cuiprintln -n '' | zstd - --stdout | zstd -d --stdout
267*01826a49SYabin Cuiprintln "test : ensure small file doesn't add 3-bytes null block"
268*01826a49SYabin Cuidatagen -g1 > tmp1
269*01826a49SYabin Cuizstd tmp1 -c | wc -c | $GREP "14"
270*01826a49SYabin Cuizstd < tmp1  | wc -c | $GREP "14"
271*01826a49SYabin Cuiprintln "test : decompress file with wrong suffix (must fail)"
272*01826a49SYabin Cuizstd -d tmpCompressed && die "wrong suffix error not detected!"
273*01826a49SYabin Cuizstd -df tmp && die "should have refused : wrong extension"
274*01826a49SYabin Cuiprintln "test : decompress into stdout"
275*01826a49SYabin Cuizstd -d tmpCompressed -c > tmpResult    # decompression using stdout
276*01826a49SYabin Cuizstd --decompress tmpCompressed -c > tmpResult
277*01826a49SYabin Cuizstd --decompress tmpCompressed --stdout > tmpResult
278*01826a49SYabin Cuiprintln "test : decompress from stdin into stdout"
279*01826a49SYabin Cuizstd -dc   < tmp.zst > $INTOVOID   # combine decompression, stdin & stdout
280*01826a49SYabin Cuizstd -dc - < tmp.zst > $INTOVOID
281*01826a49SYabin Cuizstd -d    < tmp.zst > $INTOVOID   # implicit stdout when stdin is used
282*01826a49SYabin Cuizstd -d  - < tmp.zst > $INTOVOID
283*01826a49SYabin Cuiprintln "test : impose memory limitation (must fail)"
284*01826a49SYabin Cuidatagen -g500K > tmplimit
285*01826a49SYabin Cuizstd -f tmplimit
286*01826a49SYabin Cuizstd -d -f tmplimit.zst -M2K -c > $INTOVOID && die "decompression needs more memory than allowed"
287*01826a49SYabin Cuizstd -d -f tmplimit.zst --memlimit=2K -c > $INTOVOID && die "decompression needs more memory than allowed"  # long command
288*01826a49SYabin Cuizstd -d -f tmplimit.zst --memory=2K -c > $INTOVOID && die "decompression needs more memory than allowed"  # long command
289*01826a49SYabin Cuizstd -d -f tmplimit.zst --memlimit-decompress=2K -c > $INTOVOID && die "decompression needs more memory than allowed"  # long command
290*01826a49SYabin Cuirm -f tmplimit tmplimit.zst
291*01826a49SYabin Cuiprintln "test : overwrite protection"
292*01826a49SYabin Cuizstd -q tmp && die "overwrite check failed!"
293*01826a49SYabin Cuiprintln "test : force overwrite"
294*01826a49SYabin Cuizstd -q -f tmp
295*01826a49SYabin Cuizstd -q --force tmp
296*01826a49SYabin Cuiprintln "test : overwrite readonly file"
297*01826a49SYabin Cuirm -f tmpro tmpro.zst
298*01826a49SYabin Cuiprintln foo > tmpro.zst
299*01826a49SYabin Cuiprintln foo > tmpro
300*01826a49SYabin Cuichmod 400 tmpro.zst
301*01826a49SYabin Cuizstd -q tmpro && die "should have refused to overwrite read-only file"
302*01826a49SYabin Cuizstd -q -f tmpro
303*01826a49SYabin Cuiprintln "test: --no-progress flag"
304*01826a49SYabin Cuizstd tmpro -c --no-progress | zstd -d -f -o "$INTOVOID" --no-progress
305*01826a49SYabin Cuizstd tmpro -cv --no-progress | zstd -dv -f -o "$INTOVOID" --no-progress
306*01826a49SYabin Cuiprintln "test: --progress flag"
307*01826a49SYabin Cuizstd tmpro -c | zstd -d -f -o "$INTOVOID" --progress 2>&1 | $GREP '[A-Za-z0-9._ ]*: [0-9]* bytes'
308*01826a49SYabin Cuizstd tmpro -c | zstd -d -f -q -o "$INTOVOID" --progress 2>&1 | $GREP '[A-Za-z0-9._ ]*: [0-9]* bytes'
309*01826a49SYabin Cuizstd tmpro -c | zstd -d -f -v -o "$INTOVOID" 2>&1 | $GREP '[A-Za-z0-9._ ]*: [0-9]* bytes'
310*01826a49SYabin Cuirm -f tmpro tmpro.zst
311*01826a49SYabin Cuiprintln "test: overwrite input file (must fail)"
312*01826a49SYabin Cuizstd tmp -fo tmp && die "zstd compression overwrote the input file"
313*01826a49SYabin Cuizstd tmp.zst -dfo tmp.zst && die "zstd decompression overwrote the input file"
314*01826a49SYabin Cuiprintln "test: detect that input file does not exist"
315*01826a49SYabin Cuizstd nothere && die "zstd hasn't detected that input file does not exist"
316*01826a49SYabin Cuiprintln "test: --[no-]compress-literals"
317*01826a49SYabin Cuizstd tmp -c --no-compress-literals -1       | zstd -t
318*01826a49SYabin Cuizstd tmp -c --no-compress-literals --fast=1 | zstd -t
319*01826a49SYabin Cuizstd tmp -c --no-compress-literals -19      | zstd -t
320*01826a49SYabin Cuizstd tmp -c --compress-literals    -1       | zstd -t
321*01826a49SYabin Cuizstd tmp -c --compress-literals    --fast=1 | zstd -t
322*01826a49SYabin Cuizstd tmp -c --compress-literals    -19      | zstd -t
323*01826a49SYabin Cuizstd -b --fast=1 -i0e1 tmp --compress-literals
324*01826a49SYabin Cuizstd -b --fast=1 -i0e1 tmp --no-compress-literals
325*01826a49SYabin Cuiprintln "test: --no-check for decompression"
326*01826a49SYabin Cuizstd -f tmp -o tmp_corrupt.zst --check
327*01826a49SYabin Cuizstd -f tmp -o tmp.zst --no-check
328*01826a49SYabin Cuiprintf '\xDE\xAD\xBE\xEF' | dd of=tmp_corrupt.zst bs=1 seek=$(($(wc -c < "tmp_corrupt.zst") - 4)) count=4 conv=notrunc # corrupt checksum in tmp
329*01826a49SYabin Cuizstd -d -f tmp_corrupt.zst --no-check
330*01826a49SYabin Cuizstd -d -f tmp_corrupt.zst --check --no-check # final flag overrides
331*01826a49SYabin Cuizstd -d -f tmp.zst --no-check
332*01826a49SYabin Cui
333*01826a49SYabin Cuiif [ "$isWindows" = false ] && [ "$UNAME" != "AIX" ]; then
334*01826a49SYabin Cui  if [ -n "$(which readelf)" ]; then
335*01826a49SYabin Cui    println "test: check if binary has executable stack (#2963)"
336*01826a49SYabin Cui    readelf -lW "$ZSTD_BIN" | $GREP 'GNU_STACK .* RW ' || die "zstd binary has executable stack!"
337*01826a49SYabin Cui  fi
338*01826a49SYabin Cuifi
339*01826a49SYabin Cui
340*01826a49SYabin Cuiprintln "\n===>  multiple_thread test "
341*01826a49SYabin Cui
342*01826a49SYabin Cuidatagen > tmp
343*01826a49SYabin Cuiprintln "test : single-thread "
344*01826a49SYabin Cuizstd --fast --single-thread tmp -o tmpMT0
345*01826a49SYabin Cuiprintln "test : one worker thread (default)"
346*01826a49SYabin Cuizstd --fast -T1 tmp -o tmpMT1
347*01826a49SYabin Cuiprintln "test : two worker threads "
348*01826a49SYabin Cuizstd --fast -T2 tmp -o tmpMT2
349*01826a49SYabin Cuiprintln "test : 16-thread "
350*01826a49SYabin Cuizstd --fast -T16 tmp -o tmpMT3
351*01826a49SYabin Cuiprintln "test : 127-thread "
352*01826a49SYabin Cuizstd --fast -T127 tmp -o tmpMT4
353*01826a49SYabin Cuiprintln "test : 128-thread "
354*01826a49SYabin Cuizstd --fast -T128 tmp -o tmpMT5
355*01826a49SYabin Cuiprintln "test : max allowed numeric value is 4294967295 "
356*01826a49SYabin Cuizstd --fast -4294967295 tmp -o tmpMT6
357*01826a49SYabin Cuiprintln "test : numeric value overflows 32-bit unsigned int "
358*01826a49SYabin Cuizstd --fast -4294967296 tmp -o tmptest9 && die "max allowed numeric value is 4294967295"
359*01826a49SYabin Cui
360*01826a49SYabin Cuidatagen > tmp
361*01826a49SYabin Cuiprintln "test : basic compression "
362*01826a49SYabin Cuizstd -f tmp  # trivial compression case, creates tmp.zst
363*01826a49SYabin Cuiprintln "test : basic decompression"
364*01826a49SYabin Cuizstd -d -f -T1 tmp.zst
365*01826a49SYabin Cuiprintln "note : decompression does not support -T mode, but execution support"
366*01826a49SYabin Cuirm -rf tmpMT*
367*01826a49SYabin Cui
368*01826a49SYabin Cuiprintln "\n===>  --fast_argument test "
369*01826a49SYabin Cuidatagen > tmp
370*01826a49SYabin Cuiprintln "test : basic compression "
371*01826a49SYabin Cuizstd -f tmp  # trivial compression case, creates tmp.zst
372*01826a49SYabin Cuiprintln "test: --fast=1"
373*01826a49SYabin Cuizstd --fast=1 -f tmp
374*01826a49SYabin Cuiprintln "test: --fast=99"
375*01826a49SYabin Cuizstd --fast=99 -f tmp
376*01826a49SYabin Cuiprintln "test: Invalid value -- negative number"
377*01826a49SYabin Cuizstd --fast=-1 -f tmp && die "error: Invalid value -- negative number"
378*01826a49SYabin Cuiprintln "test: Invalid value -- zero"
379*01826a49SYabin Cuizstd --fast=0 -f tmp && die "error: Invalid value -- 0 number"
380*01826a49SYabin Cuiprintln "test: max allowed numeric argument of --fast is 4294967295"
381*01826a49SYabin Cuizstd --fast=4294967295 -f tmp
382*01826a49SYabin Cuiprintln "test: numeric value overflows 32-bit unsigned int "
383*01826a49SYabin Cuizstd --fast=4294967296 -f tmp && die "max allowed argument of --fast is 4294967295"
384*01826a49SYabin Cui
385*01826a49SYabin Cuiprintln "\n===>  --exclude-compressed flag"
386*01826a49SYabin Cuirm -rf precompressedFilterTestDir
387*01826a49SYabin Cuimkdir -p precompressedFilterTestDir
388*01826a49SYabin Cuidatagen $size > precompressedFilterTestDir/input.5
389*01826a49SYabin Cuidatagen $size > precompressedFilterTestDir/input.6
390*01826a49SYabin Cuizstd --exclude-compressed --long --rm -r precompressedFilterTestDir
391*01826a49SYabin Cuidatagen $size > precompressedFilterTestDir/input.7
392*01826a49SYabin Cuidatagen $size > precompressedFilterTestDir/input.8
393*01826a49SYabin Cuizstd --exclude-compressed --long --rm -r precompressedFilterTestDir
394*01826a49SYabin Cuitest ! -f precompressedFilterTestDir/input.5.zst.zst
395*01826a49SYabin Cuitest ! -f precompressedFilterTestDir/input.6.zst.zst
396*01826a49SYabin Cuifile1timestamp=`$MTIME precompressedFilterTestDir/input.5.zst`
397*01826a49SYabin Cuifile2timestamp=`$MTIME precompressedFilterTestDir/input.7.zst`
398*01826a49SYabin Cuiif [ $file2timestamp -ge $file1timestamp ]; then
399*01826a49SYabin Cui  println "Test is successful. input.5.zst is precompressed and therefore not compressed/modified again."
400*01826a49SYabin Cuielse
401*01826a49SYabin Cui  println "Test is not successful"
402*01826a49SYabin Cuifi
403*01826a49SYabin Cui# File Extension check.
404*01826a49SYabin Cuidatagen $size > precompressedFilterTestDir/input.zstbar
405*01826a49SYabin Cuizstd --exclude-compressed --long --rm -r precompressedFilterTestDir
406*01826a49SYabin Cui# zstd should compress input.zstbar
407*01826a49SYabin Cuitest -f precompressedFilterTestDir/input.zstbar.zst
408*01826a49SYabin Cui# Check without the --exclude-compressed flag
409*01826a49SYabin Cuizstd --long --rm -r precompressedFilterTestDir
410*01826a49SYabin Cui# Files should get compressed again without the --exclude-compressed flag.
411*01826a49SYabin Cuitest -f precompressedFilterTestDir/input.5.zst.zst
412*01826a49SYabin Cuitest -f precompressedFilterTestDir/input.6.zst.zst
413*01826a49SYabin Cui
414*01826a49SYabin Cui# Test some other compressed file extensions
415*01826a49SYabin Cuidatagen $size > precompressedFilterTestDir/input.flac
416*01826a49SYabin Cuidatagen $size > precompressedFilterTestDir/input.mov
417*01826a49SYabin Cuidatagen $size > precompressedFilterTestDir/input.mp3
418*01826a49SYabin Cuizstd --exclude-compressed --long --rm -r precompressedFilterTestDir
419*01826a49SYabin Cuitest ! -f precompressedFilterTestDir/input.flac.zst
420*01826a49SYabin Cuitest ! -f precompressedFilterTestDir/input.mov.zst
421*01826a49SYabin Cuitest ! -f precompressedFilterTestDir/input.mp3.zst
422*01826a49SYabin Cuizstd --long --rm -r precompressedFilterTestDir
423*01826a49SYabin Cuitest -f precompressedFilterTestDir/input.flac.zst
424*01826a49SYabin Cuitest -f precompressedFilterTestDir/input.mov.zst
425*01826a49SYabin Cuitest -f precompressedFilterTestDir/input.mp3.zst
426*01826a49SYabin Cuirm -rf precompressedFilterTestDir
427*01826a49SYabin Cuiprintln "Test completed"
428*01826a49SYabin Cui
429*01826a49SYabin Cui
430*01826a49SYabin Cui
431*01826a49SYabin Cuiprintln "\n===>  warning prompts should not occur if stdin is an input"
432*01826a49SYabin Cuiprintln "y" > tmpPrompt
433*01826a49SYabin Cuiprintln "hello world" >> tmpPrompt
434*01826a49SYabin Cuizstd tmpPrompt -f
435*01826a49SYabin Cuizstd < tmpPrompt -o tmpPrompt.zst && die "should have aborted immediately and failed to overwrite"
436*01826a49SYabin Cuizstd < tmpPrompt -o tmpPrompt.zst -f    # should successfully overwrite with -f
437*01826a49SYabin Cuizstd -q -d -f tmpPrompt.zst -o tmpPromptRegenerated
438*01826a49SYabin Cui$DIFF tmpPromptRegenerated tmpPrompt    # the first 'y' character should not be swallowed
439*01826a49SYabin Cui
440*01826a49SYabin Cuiecho 'yes' | zstd tmpPrompt -v -o tmpPrompt.zst  # accept piped "y" input to force overwrite when using files
441*01826a49SYabin Cuiecho 'yes' | zstd < tmpPrompt -v -o tmpPrompt.zst && die "should have aborted immediately and failed to overwrite"
442*01826a49SYabin Cuizstd tmpPrompt - < tmpPrompt -o tmpPromp.zst --rm && die "should have aborted immediately and failed to remove"
443*01826a49SYabin Cui
444*01826a49SYabin Cuiprintln "Test completed"
445*01826a49SYabin Cui
446*01826a49SYabin Cui
447*01826a49SYabin Cuiprintln "\n===>  recursive mode test "
448*01826a49SYabin Cui# combination of -r with empty list of input file
449*01826a49SYabin Cuizstd -c -r < tmp > tmp.zst
450*01826a49SYabin Cui
451*01826a49SYabin Cui# combination of -r with empty folder
452*01826a49SYabin Cuimkdir -p tmpEmptyDir
453*01826a49SYabin Cuizstd -r tmpEmptyDir
454*01826a49SYabin Cuirm -rf tmpEmptyDir
455*01826a49SYabin Cui
456*01826a49SYabin Cui
457*01826a49SYabin Cuiprintln "\n===>  file removal"
458*01826a49SYabin Cuizstd -f --rm tmp
459*01826a49SYabin Cuitest ! -f tmp  # tmp should no longer be present
460*01826a49SYabin Cuizstd -f -d --rm tmp.zst
461*01826a49SYabin Cuitest ! -f tmp.zst  # tmp.zst should no longer be present
462*01826a49SYabin Cuiprintln "test: --rm is disabled when output is stdout"
463*01826a49SYabin Cuitest -f tmp
464*01826a49SYabin Cuizstd --rm tmp -c > $INTOVOID
465*01826a49SYabin Cuitest -f tmp # tmp shall still be there
466*01826a49SYabin Cuizstd --rm tmp --stdout > $INTOVOID
467*01826a49SYabin Cuitest -f tmp # tmp shall still be there
468*01826a49SYabin Cuizstd -f --rm tmp -c > $INTOVOID
469*01826a49SYabin Cuitest -f tmp # tmp shall still be there
470*01826a49SYabin Cuizstd -f tmp -c > $INTOVOID --rm
471*01826a49SYabin Cuitest -f tmp # tmp shall still be there
472*01826a49SYabin Cuiprintln "test: --rm is disabled when multiple inputs are concatenated into a single output"
473*01826a49SYabin Cuicp tmp tmp2
474*01826a49SYabin Cuizstd --rm tmp tmp2 -c > $INTOVOID
475*01826a49SYabin Cuitest -f tmp
476*01826a49SYabin Cuitest -f tmp2
477*01826a49SYabin Cuirm -f tmp3.zst
478*01826a49SYabin Cuiecho 'y' | zstd -v tmp tmp2 -o tmp3.zst --rm # prompt for confirmation
479*01826a49SYabin Cuitest -f tmp
480*01826a49SYabin Cuitest -f tmp2
481*01826a49SYabin Cuizstd -f tmp tmp2 -o tmp3.zst --rm # just warns, no prompt
482*01826a49SYabin Cuitest -f tmp
483*01826a49SYabin Cuitest -f tmp2
484*01826a49SYabin Cuizstd -q tmp tmp2 -o tmp3.zst --rm && die "should refuse to concatenate"
485*01826a49SYabin Cuiprintln "test: --rm is active with -o when single input"
486*01826a49SYabin Cuirm -f tmp2.zst
487*01826a49SYabin Cuizstd --rm tmp2 -o tmp2.zst
488*01826a49SYabin Cuitest -f tmp2.zst
489*01826a49SYabin Cuitest ! -f tmp2
490*01826a49SYabin Cuiprintln "test: -c followed by -o => -o wins, so --rm remains active" # (#3719)
491*01826a49SYabin Cuirm tmp2.zst
492*01826a49SYabin Cuicp tmp tmp2
493*01826a49SYabin Cuizstd --rm tmp2 -c > $INTOVOID -o tmp2.zst
494*01826a49SYabin Cuitest ! -f tmp2
495*01826a49SYabin Cuiprintln "test: -o followed by -c => -c wins, so --rm is disabled" # (#3719)
496*01826a49SYabin Cuirm tmp3.zst
497*01826a49SYabin Cuicp tmp tmp2
498*01826a49SYabin Cuizstd -v --rm tmp2 -o tmp2.zst -c > tmp3.zst
499*01826a49SYabin Cuitest -f tmp2
500*01826a49SYabin Cuitest -f tmp3.zst
501*01826a49SYabin Cuiprintln "test : should quietly not remove non-regular file"
502*01826a49SYabin Cuiprintln hello > tmp
503*01826a49SYabin Cuizstd tmp -f -o "$DEVDEVICE" 2>tmplog > "$INTOVOID"
504*01826a49SYabin Cui$GREP "Refusing to remove non-regular file" tmplog && die
505*01826a49SYabin Cuirm -f tmplog
506*01826a49SYabin Cuizstd tmp -f -o "$INTOVOID" 2>&1 | $GREP "Refusing to remove non-regular file" && die
507*01826a49SYabin Cuiprintln "test : --rm on stdin"
508*01826a49SYabin Cuiprintln a | zstd --rm > $INTOVOID   # --rm should remain silent
509*01826a49SYabin Cuirm -f tmp
510*01826a49SYabin Cuizstd -f tmp && die "tmp not present : should have failed"
511*01826a49SYabin Cuitest ! -f tmp.zst  # tmp.zst should not be created
512*01826a49SYabin Cuiprintln "test : -d -f do not delete destination when source is not present"
513*01826a49SYabin Cuitouch tmp    # create destination file
514*01826a49SYabin Cuizstd -d -f tmp.zst && die "attempt to decompress a non existing file"
515*01826a49SYabin Cuitest -f tmp  # destination file should still be present
516*01826a49SYabin Cuiprintln "test : -f do not delete destination when source is not present"
517*01826a49SYabin Cuirm -f tmp         # erase source file
518*01826a49SYabin Cuitouch tmp.zst  # create destination file
519*01826a49SYabin Cuizstd -f tmp && die "attempt to compress a non existing file"
520*01826a49SYabin Cuitest -f tmp.zst  # destination file should still be present
521*01826a49SYabin Cuirm -rf tmp*  # may also erase tmp* directory from previous failed run
522*01826a49SYabin Cui
523*01826a49SYabin Cui
524*01826a49SYabin Cuiprintln "\n===>  decompression only tests "
525*01826a49SYabin Cui# the following test verifies that the decoder is compatible with RLE as first block
526*01826a49SYabin Cui# older versions of zstd cli are not able to decode such corner case.
527*01826a49SYabin Cui# As a consequence, the zstd cli do not generate them, to maintain compatibility with older versions.
528*01826a49SYabin Cuidd bs=1048576 count=1 if=/dev/zero of=tmp
529*01826a49SYabin Cuizstd -d -o tmp1 "$TESTDIR/golden-decompression/rle-first-block.zst"
530*01826a49SYabin Cui$DIFF -s tmp1 tmp
531*01826a49SYabin Cui
532*01826a49SYabin Cuitouch tmp_empty
533*01826a49SYabin Cuizstd -d -o tmp2 "$TESTDIR/golden-decompression/empty-block.zst"
534*01826a49SYabin Cui$DIFF -s tmp2 tmp_empty
535*01826a49SYabin Cui
536*01826a49SYabin Cuizstd -t "$TESTDIR/golden-decompression/zeroSeq_2B.zst"
537*01826a49SYabin Cui
538*01826a49SYabin Cuizstd -t "$TESTDIR/golden-decompression-errors/zeroSeq_extraneous.zst" && die "invalid Sequences section should have been detected"
539*01826a49SYabin Cui
540*01826a49SYabin Cuirm -f tmp*
541*01826a49SYabin Cui
542*01826a49SYabin Cuiprintln "\n===>  compress multiple files"
543*01826a49SYabin Cuiprintln hello > tmp1
544*01826a49SYabin Cuiprintln world > tmp2
545*01826a49SYabin Cuizstd tmp1 tmp2 -o "$INTOVOID" -f
546*01826a49SYabin Cuizstd tmp1 tmp2 -c | zstd -t
547*01826a49SYabin Cuiecho 'y' | zstd -v tmp1 tmp2 -o tmp.zst
548*01826a49SYabin Cuitest ! -f tmp1.zst
549*01826a49SYabin Cuitest ! -f tmp2.zst
550*01826a49SYabin Cuizstd tmp1 tmp2
551*01826a49SYabin Cuizstd -t tmp1.zst tmp2.zst
552*01826a49SYabin Cuizstd -dc tmp1.zst tmp2.zst
553*01826a49SYabin Cuizstd tmp1.zst tmp2.zst -o "$INTOVOID" -f
554*01826a49SYabin Cuiecho 'y' | zstd -v -d tmp1.zst tmp2.zst -o tmp
555*01826a49SYabin Cuitouch tmpexists
556*01826a49SYabin Cuizstd tmp1 tmp2 -f -o tmpexists
557*01826a49SYabin Cuizstd tmp1 tmp2 -q -o tmpexists && die "should have refused to overwrite"
558*01826a49SYabin Cuiprintln gooder > tmp_rm1
559*01826a49SYabin Cuiprintln boi > tmp_rm2
560*01826a49SYabin Cuiprintln worldly > tmp_rm3
561*01826a49SYabin Cuiecho 'y' | zstd -v tmp_rm1 tmp_rm2 -v -o tmp_rm3.zst
562*01826a49SYabin Cuitest -f tmp_rm1
563*01826a49SYabin Cuitest -f tmp_rm2
564*01826a49SYabin Cuicp tmp_rm3.zst tmp_rm4.zst
565*01826a49SYabin Cuiecho 'Y' | zstd -v -d tmp_rm3.zst tmp_rm4.zst -v -o tmp_rm_out --rm
566*01826a49SYabin Cuitest -f tmp_rm3.zst
567*01826a49SYabin Cuitest -f tmp_rm4.zst
568*01826a49SYabin Cuiprintln gooder > tmpexists1
569*01826a49SYabin Cuizstd tmpexists1 tmpexists -c --rm -f > $INTOVOID
570*01826a49SYabin Cui# Bug: PR #972
571*01826a49SYabin Cuiif [ "$?" -eq 139 ]; then
572*01826a49SYabin Cui  die "should not have segfaulted"
573*01826a49SYabin Cuifi
574*01826a49SYabin Cuitest -f tmpexists1
575*01826a49SYabin Cuitest -f tmpexists
576*01826a49SYabin Cuiprintln "\n===>  multiple files and shell completion "
577*01826a49SYabin Cuidatagen -s1        > tmp1 2> $INTOVOID
578*01826a49SYabin Cuidatagen -s2 -g100K > tmp2 2> $INTOVOID
579*01826a49SYabin Cuidatagen -s3 -g1M   > tmp3 2> $INTOVOID
580*01826a49SYabin Cuiprintln "compress tmp* : "
581*01826a49SYabin Cuizstd -f tmp*
582*01826a49SYabin Cuitest -f tmp1.zst
583*01826a49SYabin Cuitest -f tmp2.zst
584*01826a49SYabin Cuitest -f tmp3.zst
585*01826a49SYabin Cuirm -f tmp1 tmp2 tmp3
586*01826a49SYabin Cuiprintln "decompress tmp* : "
587*01826a49SYabin Cuizstd -df ./*.zst
588*01826a49SYabin Cuitest -f tmp1
589*01826a49SYabin Cuitest -f tmp2
590*01826a49SYabin Cuitest -f tmp3
591*01826a49SYabin Cuiprintln "compress tmp* into stdout > tmpall : "
592*01826a49SYabin Cuizstd -c tmp1 tmp2 tmp3 > tmpall
593*01826a49SYabin Cuitest -f tmpall  # should check size of tmpall (should be tmp1.zst + tmp2.zst + tmp3.zst)
594*01826a49SYabin Cuiprintln "decompress tmpall* into stdout > tmpdec : "
595*01826a49SYabin Cuicp tmpall tmpall2
596*01826a49SYabin Cuizstd -dc tmpall* > tmpdec
597*01826a49SYabin Cuitest -f tmpdec  # should check size of tmpdec (should be 2*(tmp1 + tmp2 + tmp3))
598*01826a49SYabin Cuiprintln "compress multiple files including a missing one (notHere) : "
599*01826a49SYabin Cuizstd -f tmp1 notHere tmp2 && die "missing file not detected!"
600*01826a49SYabin Cuirm -f tmp*
601*01826a49SYabin Cui
602*01826a49SYabin Cui
603*01826a49SYabin Cuiif [ "$isWindows" = false ] ; then
604*01826a49SYabin Cui    println "\n===>  zstd fifo named pipe test "
605*01826a49SYabin Cui    echo "Hello World!" > tmp_original
606*01826a49SYabin Cui    mkfifo tmp_named_pipe
607*01826a49SYabin Cui    # note : fifo test doesn't work in combination with `dd` or `cat`
608*01826a49SYabin Cui    echo "Hello World!" > tmp_named_pipe &
609*01826a49SYabin Cui    zstd tmp_named_pipe -o tmp_compressed
610*01826a49SYabin Cui    zstd -d -o tmp_decompressed tmp_compressed
611*01826a49SYabin Cui    $DIFF -s tmp_original tmp_decompressed
612*01826a49SYabin Cui    rm -rf tmp*
613*01826a49SYabin Cuifi
614*01826a49SYabin Cui
615*01826a49SYabin Cuiprintln "\n===>  zstd created file permissions tests"
616*01826a49SYabin Cuiif [ "$isWindows" = false ] ; then
617*01826a49SYabin Cui    rm -f tmp1 tmp2 tmp1.zst tmp2.zst tmp1.out tmp2.out # todo: remove
618*01826a49SYabin Cui
619*01826a49SYabin Cui    ORIGINAL_UMASK=$(umask)
620*01826a49SYabin Cui    umask 0000
621*01826a49SYabin Cui
622*01826a49SYabin Cui    datagen > tmp1
623*01826a49SYabin Cui    datagen > tmp2
624*01826a49SYabin Cui    assertFilePermissions tmp1 666
625*01826a49SYabin Cui    assertFilePermissions tmp2 666
626*01826a49SYabin Cui
627*01826a49SYabin Cui    println "test : copy 666 permissions in file -> file compression "
628*01826a49SYabin Cui    zstd -f tmp1 -o tmp1.zst
629*01826a49SYabin Cui    assertSamePermissions tmp1 tmp1.zst
630*01826a49SYabin Cui    println "test : copy 666 permissions in file -> file decompression "
631*01826a49SYabin Cui    zstd -f -d tmp1.zst -o tmp1.out
632*01826a49SYabin Cui    assertSamePermissions tmp1.zst tmp1.out
633*01826a49SYabin Cui
634*01826a49SYabin Cui    rm -f tmp1.zst tmp1.out
635*01826a49SYabin Cui
636*01826a49SYabin Cui    println "test : copy 400 permissions in file -> file compression (write to a read-only file) "
637*01826a49SYabin Cui    chmod 0400 tmp1
638*01826a49SYabin Cui    assertFilePermissions tmp1 400
639*01826a49SYabin Cui    zstd -f tmp1 -o tmp1.zst
640*01826a49SYabin Cui    assertSamePermissions tmp1 tmp1.zst
641*01826a49SYabin Cui    println "test : copy 400 permissions in file -> file decompression (write to a read-only file) "
642*01826a49SYabin Cui    zstd -f -d tmp1.zst -o tmp1
643*01826a49SYabin Cui    assertSamePermissions tmp1.zst tmp1
644*01826a49SYabin Cui
645*01826a49SYabin Cui    rm -f tmp1.zst tmp1.out
646*01826a49SYabin Cui
647*01826a49SYabin Cui    println "test : check created permissions from stdin input in compression "
648*01826a49SYabin Cui    zstd -f -o tmp1.zst < tmp1
649*01826a49SYabin Cui    assertFilePermissions tmp1.zst 666
650*01826a49SYabin Cui    println "test : check created permissions from stdin input in decompression "
651*01826a49SYabin Cui    zstd -f -d -o tmp1.out < tmp1.zst
652*01826a49SYabin Cui    assertFilePermissions tmp1.out 666
653*01826a49SYabin Cui
654*01826a49SYabin Cui    rm -f tmp1.zst tmp1.out
655*01826a49SYabin Cui
656*01826a49SYabin Cui    println "test : check created permissions from multiple inputs in compression "
657*01826a49SYabin Cui    zstd -f tmp1 tmp2 -o tmp1.zst
658*01826a49SYabin Cui    assertFilePermissions tmp1.zst 666
659*01826a49SYabin Cui    println "test : check created permissions from multiple inputs in decompression "
660*01826a49SYabin Cui    cp tmp1.zst tmp2.zst
661*01826a49SYabin Cui    zstd -f -d tmp1.zst tmp2.zst -o tmp1.out
662*01826a49SYabin Cui    assertFilePermissions tmp1.out 666
663*01826a49SYabin Cui
664*01826a49SYabin Cui    rm -f tmp1.zst tmp2.zst tmp1.out tmp2.out
665*01826a49SYabin Cui
666*01826a49SYabin Cui    println "test : check permissions on pre-existing output file in compression "
667*01826a49SYabin Cui    chmod 0600 tmp1
668*01826a49SYabin Cui    touch tmp1.zst
669*01826a49SYabin Cui    chmod 0400 tmp1.zst
670*01826a49SYabin Cui    zstd -f tmp1 -o tmp1.zst
671*01826a49SYabin Cui    assertFilePermissions tmp1.zst 600
672*01826a49SYabin Cui    println "test : check permissions on pre-existing output file in decompression "
673*01826a49SYabin Cui    chmod 0400 tmp1.zst
674*01826a49SYabin Cui    touch tmp1.out
675*01826a49SYabin Cui    chmod 0200 tmp1.out
676*01826a49SYabin Cui    zstd -f -d tmp1.zst -o tmp1.out
677*01826a49SYabin Cui    assertFilePermissions tmp1.out 400
678*01826a49SYabin Cui
679*01826a49SYabin Cui    umask 0666
680*01826a49SYabin Cui    chmod 0666 tmp1 tmp2
681*01826a49SYabin Cui
682*01826a49SYabin Cui    rm -f tmp1.zst tmp1.out
683*01826a49SYabin Cui
684*01826a49SYabin Cui    println "test : respect umask when compressing from stdin input "
685*01826a49SYabin Cui    zstd -f -o tmp1.zst < tmp1
686*01826a49SYabin Cui    assertFilePermissions tmp1.zst 0
687*01826a49SYabin Cui    println "test : respect umask when decompressing from stdin input "
688*01826a49SYabin Cui    chmod 0666 tmp1.zst
689*01826a49SYabin Cui    zstd -f -d -o tmp1.out < tmp1.zst
690*01826a49SYabin Cui    assertFilePermissions tmp1.out 0
691*01826a49SYabin Cui
692*01826a49SYabin Cui    rm -f tmp1 tmp2 tmp1.zst tmp2.zst tmp1.out tmp2.out
693*01826a49SYabin Cui    umask $ORIGINAL_UMASK
694*01826a49SYabin Cuifi
695*01826a49SYabin Cui
696*01826a49SYabin Cuiif [ -n "$DEVNULLRIGHTS" ] ; then
697*01826a49SYabin Cui    # these tests requires sudo rights, which is uncommon.
698*01826a49SYabin Cui    # they are only triggered if DEVNULLRIGHTS macro is defined.
699*01826a49SYabin Cui    println "\n===> checking /dev/null permissions are unaltered "
700*01826a49SYabin Cui    datagen > tmp
701*01826a49SYabin Cui    sudoZstd tmp -o $INTOVOID   # sudo rights could modify /dev/null permissions
702*01826a49SYabin Cui    sudoZstd tmp -c > $INTOVOID
703*01826a49SYabin Cui    zstd tmp -f -o tmp.zst
704*01826a49SYabin Cui    sudoZstd -d tmp.zst -c > $INTOVOID
705*01826a49SYabin Cui    sudoZstd -d tmp.zst -o $INTOVOID
706*01826a49SYabin Cui    ls -las $INTOVOID | $GREP "rw-rw-rw-"
707*01826a49SYabin Cuifi
708*01826a49SYabin Cui
709*01826a49SYabin Cuiif [ -n "$READFROMBLOCKDEVICE" ] ; then
710*01826a49SYabin Cui    # This creates a temporary block device, which is only possible on unix-y
711*01826a49SYabin Cui    # systems, is somewhat invasive, and requires sudo. For these reasons, you
712*01826a49SYabin Cui    # have to specifically ask for this test.
713*01826a49SYabin Cui    println "\n===> checking that zstd can read from a block device"
714*01826a49SYabin Cui    datagen -g65536 > tmp.img
715*01826a49SYabin Cui    sudo losetup -fP tmp.img
716*01826a49SYabin Cui    LOOP_DEV=$(losetup -a | $GREP 'tmp\.img' | cut -f1 -d:)
717*01826a49SYabin Cui    [ -z "$LOOP_DEV" ] && die "failed to get loopback device"
718*01826a49SYabin Cui    sudoZstd $LOOP_DEV -c > tmp.img.zst && die "should fail without -f"
719*01826a49SYabin Cui    sudoZstd -f $LOOP_DEV -c > tmp.img.zst
720*01826a49SYabin Cui    zstd -d tmp.img.zst -o tmp.img.copy
721*01826a49SYabin Cui    sudo losetup -d $LOOP_DEV
722*01826a49SYabin Cui    $DIFF -s tmp.img tmp.img.copy || die "round trip failed"
723*01826a49SYabin Cui    rm -f tmp.img tmp.img.zst tmp.img.copy
724*01826a49SYabin Cuifi
725*01826a49SYabin Cui
726*01826a49SYabin Cuiprintln "\n===>  zstd created file timestamp tests"
727*01826a49SYabin Cuidatagen > tmp
728*01826a49SYabin Cuitouch -m -t 200001010000.00 tmp
729*01826a49SYabin Cuiprintln "test : copy mtime in file -> file compression "
730*01826a49SYabin Cuizstd -f tmp -o tmp.zst
731*01826a49SYabin CuiassertSameMTime tmp tmp.zst
732*01826a49SYabin Cuiprintln "test : copy mtime in file -> file decompression "
733*01826a49SYabin Cuizstd -f -d tmp.zst -o tmp.out
734*01826a49SYabin CuiassertSameMTime tmp.zst tmp.out
735*01826a49SYabin Cuirm -f tmp
736*01826a49SYabin Cui
737*01826a49SYabin Cuiprintln "\n===>  compress multiple files into an output directory, --output-dir-flat"
738*01826a49SYabin Cuiprintln henlo > tmp1
739*01826a49SYabin Cuimkdir tmpInputTestDir
740*01826a49SYabin Cuimkdir tmpInputTestDir/we
741*01826a49SYabin Cuimkdir tmpInputTestDir/we/must
742*01826a49SYabin Cuimkdir tmpInputTestDir/we/must/go
743*01826a49SYabin Cuimkdir tmpInputTestDir/we/must/go/deeper
744*01826a49SYabin Cuiprintln cool > tmpInputTestDir/we/must/go/deeper/tmp2
745*01826a49SYabin Cuimkdir tmpOutDir
746*01826a49SYabin Cuizstd tmp1 tmpInputTestDir/we/must/go/deeper/tmp2 --output-dir-flat tmpOutDir
747*01826a49SYabin Cuitest -f tmpOutDir/tmp1.zst
748*01826a49SYabin Cuitest -f tmpOutDir/tmp2.zst
749*01826a49SYabin Cuiprintln "test : decompress multiple files into an output directory, --output-dir-flat"
750*01826a49SYabin Cuimkdir tmpOutDirDecomp
751*01826a49SYabin Cuizstd tmpOutDir -r -d --output-dir-flat tmpOutDirDecomp
752*01826a49SYabin Cuitest -f tmpOutDirDecomp/tmp2
753*01826a49SYabin Cuitest -f tmpOutDirDecomp/tmp1
754*01826a49SYabin Cuirm -f tmpOutDirDecomp/*
755*01826a49SYabin Cuizstd tmpOutDir -r -d --output-dir-flat=tmpOutDirDecomp
756*01826a49SYabin Cuitest -f tmpOutDirDecomp/tmp2
757*01826a49SYabin Cuitest -f tmpOutDirDecomp/tmp1
758*01826a49SYabin Cuirm -rf tmp*
759*01826a49SYabin Cui
760*01826a49SYabin Cuiif [ "$isWindows" = false ] ; then
761*01826a49SYabin Cui    println "\n===>  compress multiple files into an output directory and mirror input folder, --output-dir-mirror"
762*01826a49SYabin Cui    println "test --output-dir-mirror" > tmp1
763*01826a49SYabin Cui    mkdir -p tmpInputTestDir/we/.../..must/go/deeper..
764*01826a49SYabin Cui    println cool > tmpInputTestDir/we/.../..must/go/deeper../tmp2
765*01826a49SYabin Cui    zstd tmp1 -r tmpInputTestDir --output-dir-mirror tmpOutDir
766*01826a49SYabin Cui    test -f tmpOutDir/tmp1.zst
767*01826a49SYabin Cui    test -f tmpOutDir/tmpInputTestDir/we/.../..must/go/deeper../tmp2.zst
768*01826a49SYabin Cui
769*01826a49SYabin Cui    println "test: compress input dir will be ignored if it has '..'"
770*01826a49SYabin Cui    zstd  -r tmpInputTestDir/we/.../..must/../..mustgo/deeper.. --output-dir-mirror non-exist && die "input cannot contain '..'"
771*01826a49SYabin Cui    zstd  -r tmpInputTestDir/we/.../..must/deeper../.. --output-dir-mirror non-exist && die "input cannot contain '..'"
772*01826a49SYabin Cui    zstd  -r ../tests/tmpInputTestDir/we/.../..must/deeper.. --output-dir-mirror non-exist && die "input cannot contain '..'"
773*01826a49SYabin Cui    test ! -d non-exist
774*01826a49SYabin Cui
775*01826a49SYabin Cui    println "test: compress input dir should succeed with benign uses of '..'"
776*01826a49SYabin Cui    zstd  -r tmpInputTestDir/we/.../..must/go/deeper.. --output-dir-mirror tmpout
777*01826a49SYabin Cui    test -d tmpout
778*01826a49SYabin Cui
779*01826a49SYabin Cui    println "test : decompress multiple files into an output directory, --output-dir-mirror"
780*01826a49SYabin Cui    zstd tmpOutDir -r -d --output-dir-mirror tmpOutDirDecomp
781*01826a49SYabin Cui    test -f tmpOutDirDecomp/tmpOutDir/tmp1
782*01826a49SYabin Cui    test -f tmpOutDirDecomp/tmpOutDir/tmpInputTestDir/we/.../..must/go/deeper../tmp2
783*01826a49SYabin Cui
784*01826a49SYabin Cui    println "test: decompress input dir will be ignored if it has '..'"
785*01826a49SYabin Cui    zstd  -r tmpOutDir/tmpInputTestDir/we/.../..must/../..must --output-dir-mirror non-exist && die "input cannot contain '..'"
786*01826a49SYabin Cui    test ! -d non-exist
787*01826a49SYabin Cui
788*01826a49SYabin Cui    rm -rf tmp*
789*01826a49SYabin Cuifi
790*01826a49SYabin Cui
791*01826a49SYabin Cui
792*01826a49SYabin Cuiprintln "test : compress multiple files reading them from a file, --filelist=FILE"
793*01826a49SYabin Cuiprintln "Hello world!, file1" > tmp1
794*01826a49SYabin Cuiprintln "Hello world!, file2" > tmp2
795*01826a49SYabin Cuiprintln tmp1 > tmp_fileList
796*01826a49SYabin Cuiprintln tmp2 >> tmp_fileList
797*01826a49SYabin Cuizstd -f --filelist=tmp_fileList
798*01826a49SYabin Cuitest -f tmp2.zst
799*01826a49SYabin Cuitest -f tmp1.zst
800*01826a49SYabin Cui
801*01826a49SYabin Cuiprintln "test : alternate syntax: --filelist FILE"
802*01826a49SYabin Cuizstd -f --filelist tmp_fileList
803*01826a49SYabin Cuitest -f tmp2.zst
804*01826a49SYabin Cuitest -f tmp1.zst
805*01826a49SYabin Cui
806*01826a49SYabin Cuiprintln "test : reading file list from a symlink, --filelist=FILE"
807*01826a49SYabin Cuirm -f *.zst
808*01826a49SYabin Cuiln -s tmp_fileList tmp_symLink
809*01826a49SYabin Cuizstd -f --filelist=tmp_symLink
810*01826a49SYabin Cuitest -f tmp2.zst
811*01826a49SYabin Cuitest -f tmp1.zst
812*01826a49SYabin Cui
813*01826a49SYabin Cuiprintln "test : compress multiple files reading them from multiple files, --filelist=FILE"
814*01826a49SYabin Cuirm -f *.zst
815*01826a49SYabin Cuiprintln "Hello world!, file3" > tmp3
816*01826a49SYabin Cuiprintln "Hello world!, file4" > tmp4
817*01826a49SYabin Cuiprintln tmp3 > tmp_fileList2
818*01826a49SYabin Cuiprintln tmp4 >> tmp_fileList2
819*01826a49SYabin Cuizstd -f --filelist=tmp_fileList --filelist=tmp_fileList2
820*01826a49SYabin Cuitest -f tmp1.zst
821*01826a49SYabin Cuitest -f tmp2.zst
822*01826a49SYabin Cuitest -f tmp3.zst
823*01826a49SYabin Cuitest -f tmp4.zst
824*01826a49SYabin Cui
825*01826a49SYabin Cuiprintln "test : decompress multiple files reading them from a file, --filelist=FILE"
826*01826a49SYabin Cuirm -f tmp1 tmp2
827*01826a49SYabin Cuiprintln tmp1.zst > tmpZst
828*01826a49SYabin Cuiprintln tmp2.zst >> tmpZst
829*01826a49SYabin Cuizstd -d -f --filelist=tmpZst
830*01826a49SYabin Cuitest -f tmp1
831*01826a49SYabin Cuitest -f tmp2
832*01826a49SYabin Cui
833*01826a49SYabin Cuiprintln "test : decompress multiple files reading them from multiple files, --filelist=FILE"
834*01826a49SYabin Cuirm -f tmp1 tmp2 tmp3 tmp4
835*01826a49SYabin Cuiprintln tmp3.zst > tmpZst2
836*01826a49SYabin Cuiprintln tmp4.zst >> tmpZst2
837*01826a49SYabin Cuizstd -d -f --filelist=tmpZst --filelist=tmpZst2
838*01826a49SYabin Cuitest -f tmp1
839*01826a49SYabin Cuitest -f tmp2
840*01826a49SYabin Cuitest -f tmp3
841*01826a49SYabin Cuitest -f tmp4
842*01826a49SYabin Cui
843*01826a49SYabin Cuiprintln "test : survive the list of files with too long filenames (--filelist=FILE)"
844*01826a49SYabin Cuidatagen -g5M > tmp_badList
845*01826a49SYabin Cuizstd -qq -f --filelist=tmp_badList && die "should have failed : file name length is too long"  # printing very long text garbage on console will cause CI failure
846*01826a49SYabin Cui
847*01826a49SYabin Cuiprintln "test : survive a list of files which is text garbage (--filelist=FILE)"
848*01826a49SYabin Cuidatagen > tmp_badList
849*01826a49SYabin Cuizstd -qq -f --filelist=tmp_badList && die "should have failed : list is text garbage"  # printing very long text garbage on console will cause CI failure
850*01826a49SYabin Cui
851*01826a49SYabin Cuiprintln "test : survive a list of files which is binary garbage (--filelist=FILE)"
852*01826a49SYabin Cuidatagen -P0 -g1M > tmp_badList
853*01826a49SYabin Cuizstd -qq -f --filelist=tmp_badList && die "should have failed : list is binary garbage"  # let's avoid printing binary garbage on console
854*01826a49SYabin Cui
855*01826a49SYabin Cuiprintln "test : try to overflow internal list of files (--filelist=FILE)"
856*01826a49SYabin Cuitouch tmp1 tmp2 tmp3 tmp4 tmp5 tmp6
857*01826a49SYabin Cuils tmp* > tmpList
858*01826a49SYabin Cuizstd -f tmp1 --filelist=tmpList --filelist=tmpList tmp2 tmp3  # can trigger an overflow of internal file list
859*01826a49SYabin Cuirm -rf tmp*
860*01826a49SYabin Cui
861*01826a49SYabin Cuiprintln "\n===> --[no-]content-size tests"
862*01826a49SYabin Cui
863*01826a49SYabin Cuidatagen > tmp_contentsize
864*01826a49SYabin Cuizstd -f tmp_contentsize
865*01826a49SYabin Cuizstd -lv tmp_contentsize.zst | $GREP "Decompressed Size:"
866*01826a49SYabin Cuizstd -f --no-content-size tmp_contentsize
867*01826a49SYabin Cuizstd -lv tmp_contentsize.zst | $GREP "Decompressed Size:" && die
868*01826a49SYabin Cuizstd -f --content-size tmp_contentsize
869*01826a49SYabin Cuizstd -lv tmp_contentsize.zst | $GREP "Decompressed Size:"
870*01826a49SYabin Cuizstd -f --content-size --no-content-size tmp_contentsize
871*01826a49SYabin Cuizstd -lv tmp_contentsize.zst | $GREP "Decompressed Size:" && die
872*01826a49SYabin Cuirm -rf tmp*
873*01826a49SYabin Cui
874*01826a49SYabin Cuiprintln "test : show-default-cparams regular"
875*01826a49SYabin Cuidatagen > tmp
876*01826a49SYabin Cuizstd --show-default-cparams -f tmp
877*01826a49SYabin Cuizstd --show-default-cparams -d tmp.zst && die "error: can't use --show-default-cparams in decompression mode"
878*01826a49SYabin Cuirm -rf tmp*
879*01826a49SYabin Cui
880*01826a49SYabin Cuiprintln "test : show-default-cparams recursive"
881*01826a49SYabin Cuimkdir tmp_files
882*01826a49SYabin Cuidatagen -g15000 > tmp_files/tmp1
883*01826a49SYabin Cuidatagen -g129000 > tmp_files/tmp2
884*01826a49SYabin Cuidatagen -g257000 > tmp_files/tmp3
885*01826a49SYabin Cuizstd --show-default-cparams -f -r tmp_files
886*01826a49SYabin Cuirm -rf tmp*
887*01826a49SYabin Cui
888*01826a49SYabin Cuiprintln "test : show compression parameters in verbose mode"
889*01826a49SYabin Cuidatagen > tmp
890*01826a49SYabin Cuizstd -vv tmp 2>&1 | \
891*01826a49SYabin Cui$GREP -q -- "--zstd=wlog=[0-9]*,clog=[0-9]*,hlog=[0-9]*,slog=[0-9]*,mml=[0-9]*,tlen=[0-9]*,strat=[0-9]*"
892*01826a49SYabin Cuirm -rf tmp*
893*01826a49SYabin Cui
894*01826a49SYabin Cuiprintln "\n===>  Advanced compression parameters "
895*01826a49SYabin Cuiprintln "Hello world!" | zstd --zstd=windowLog=21,      - -o tmp.zst && die "wrong parameters not detected!"
896*01826a49SYabin Cuiprintln "Hello world!" | zstd --zstd=windowLo=21        - -o tmp.zst && die "wrong parameters not detected!"
897*01826a49SYabin Cuiprintln "Hello world!" | zstd --zstd=windowLog=21,slog  - -o tmp.zst && die "wrong parameters not detected!"
898*01826a49SYabin Cuiprintln "Hello world!" | zstd --zstd=strategy=10        - -o tmp.zst && die "parameter out of bound not detected!"  # > btultra2 : does not exist
899*01826a49SYabin Cuitest ! -f tmp.zst  # tmp.zst should not be created
900*01826a49SYabin CuiroundTripTest -g512K
901*01826a49SYabin CuiroundTripTest -g512K " --zstd=mml=3,tlen=48,strat=6"
902*01826a49SYabin CuiroundTripTest -g512K " --zstd=strat=6,wlog=23,clog=23,hlog=22,slog=6"
903*01826a49SYabin CuiroundTripTest -g512K " --zstd=windowLog=23,chainLog=23,hashLog=22,searchLog=6,minMatch=3,targetLength=48,strategy=6"
904*01826a49SYabin CuiroundTripTest -g512K " --single-thread --long --zstd=ldmHashLog=20,ldmMinMatch=64,ldmBucketSizeLog=1,ldmHashRateLog=7"
905*01826a49SYabin CuiroundTripTest -g512K " --single-thread --long --zstd=lhlog=20,lmml=64,lblog=1,lhrlog=7"
906*01826a49SYabin CuiroundTripTest -g64K  "19 --zstd=strat=9"   # btultra2
907*01826a49SYabin Cui
908*01826a49SYabin Cui
909*01826a49SYabin Cuiprintln "\n===>  Pass-Through mode "
910*01826a49SYabin Cuiprintln "Hello world 1!" | zstd -df
911*01826a49SYabin Cuiprintln "Hello world 2!" | zstd -dcf
912*01826a49SYabin Cuiprintln "Hello world 3!" > tmp1
913*01826a49SYabin Cuizstd -dcf tmp1
914*01826a49SYabin Cuiprintln "" | zstd -df > tmp1
915*01826a49SYabin Cuiprintln "" > tmp2
916*01826a49SYabin Cui$DIFF -q tmp1 tmp2
917*01826a49SYabin Cuiprintln "1" | zstd -df > tmp1
918*01826a49SYabin Cuiprintln "1" > tmp2
919*01826a49SYabin Cui$DIFF -q tmp1 tmp2
920*01826a49SYabin Cuiprintln "12" | zstd -df > tmp1
921*01826a49SYabin Cuiprintln "12" > tmp2
922*01826a49SYabin Cui$DIFF -q tmp1 tmp2
923*01826a49SYabin Cuirm -rf tmp*
924*01826a49SYabin Cui
925*01826a49SYabin Cui
926*01826a49SYabin Cuiprintln "\n===>  frame concatenation "
927*01826a49SYabin Cuiprintln "hello " > hello.tmp
928*01826a49SYabin Cuiprintln "world!" > world.tmp
929*01826a49SYabin Cuicat hello.tmp world.tmp > helloworld.tmp
930*01826a49SYabin Cuizstd -c hello.tmp > hello.zst
931*01826a49SYabin Cuizstd -c world.tmp > world.zst
932*01826a49SYabin Cuizstd -c hello.tmp world.tmp > helloworld.zst
933*01826a49SYabin Cuizstd -dc helloworld.zst > result.tmp
934*01826a49SYabin Cui$DIFF helloworld.tmp result.tmp
935*01826a49SYabin Cuicat hello.zst world.zst > helloworld.zst
936*01826a49SYabin Cuizstd -dc helloworld.zst > result.tmp
937*01826a49SYabin Cuicat result.tmp
938*01826a49SYabin Cui$DIFF helloworld.tmp result.tmp
939*01826a49SYabin Cuiprintln "frame concatenation without checksum"
940*01826a49SYabin Cuizstd -c hello.tmp > hello.zst --no-check
941*01826a49SYabin Cuizstd -c world.tmp > world.zst --no-check
942*01826a49SYabin Cuicat hello.zst world.zst > helloworld.zstd
943*01826a49SYabin Cuizstd -dc helloworld.zst > result.tmp
944*01826a49SYabin Cui$DIFF helloworld.tmp result.tmp
945*01826a49SYabin Cuiprintln "testing zstdcat symlink"
946*01826a49SYabin Cuiln -sf "$ZSTD_BIN" zstdcat
947*01826a49SYabin Cui$EXE_PREFIX ./zstdcat helloworld.zst > result.tmp
948*01826a49SYabin Cui$DIFF helloworld.tmp result.tmp
949*01826a49SYabin Cuiln -s helloworld.zst helloworld.link.zst
950*01826a49SYabin Cui$EXE_PREFIX ./zstdcat helloworld.link.zst > result.tmp
951*01826a49SYabin Cui$DIFF helloworld.tmp result.tmp
952*01826a49SYabin Cuirm -f zstdcat
953*01826a49SYabin Cuirm -f result.tmp
954*01826a49SYabin Cuiprintln "testing zcat symlink"
955*01826a49SYabin Cuiln -sf "$ZSTD_BIN" zcat
956*01826a49SYabin Cui$EXE_PREFIX ./zcat helloworld.zst > result.tmp
957*01826a49SYabin Cui$DIFF helloworld.tmp result.tmp
958*01826a49SYabin Cui$EXE_PREFIX ./zcat helloworld.link.zst > result.tmp
959*01826a49SYabin Cui$DIFF helloworld.tmp result.tmp
960*01826a49SYabin Cuirm -f zcat
961*01826a49SYabin Cuirm -f ./*.tmp ./*.zstd
962*01826a49SYabin Cuiprintln "frame concatenation tests completed"
963*01826a49SYabin Cui
964*01826a49SYabin Cui
965*01826a49SYabin Cuiif [ "$isWindows" = false ] && [ "$UNAME" != 'SunOS' ] && [ "$UNAME" != "OpenBSD" ] && [ "$UNAME" != "AIX" ]; then
966*01826a49SYabin Cuiprintln "\n**** flush write error test **** "
967*01826a49SYabin Cui
968*01826a49SYabin Cuiprintln "println foo | zstd > /dev/full"
969*01826a49SYabin Cuiprintln foo | zstd > /dev/full && die "write error not detected!"
970*01826a49SYabin Cuiprintln "println foo | zstd | zstd -d > /dev/full"
971*01826a49SYabin Cuiprintln foo | zstd | zstd -d > /dev/full && die "write error not detected!"
972*01826a49SYabin Cui
973*01826a49SYabin Cuifi
974*01826a49SYabin Cui
975*01826a49SYabin Cui
976*01826a49SYabin Cuiif [ "$isWindows" = false ] && [ "$UNAME" != 'SunOS' ] ; then
977*01826a49SYabin Cui
978*01826a49SYabin Cuiprintln "\n===>  symbolic link test "
979*01826a49SYabin Cui
980*01826a49SYabin Cuirm -f hello.tmp world.tmp world2.tmp hello.tmp.zst world.tmp.zst
981*01826a49SYabin Cuiprintln "hello world" > hello.tmp
982*01826a49SYabin Cuiln -s hello.tmp world.tmp
983*01826a49SYabin Cuiln -s hello.tmp world2.tmp
984*01826a49SYabin Cuizstd world.tmp hello.tmp || true
985*01826a49SYabin Cuitest -f hello.tmp.zst  # regular file should have been compressed!
986*01826a49SYabin Cuitest ! -f world.tmp.zst  # symbolic link should not have been compressed!
987*01826a49SYabin Cuizstd world.tmp || true
988*01826a49SYabin Cuitest ! -f world.tmp.zst  # symbolic link should not have been compressed!
989*01826a49SYabin Cuizstd world.tmp world2.tmp || true
990*01826a49SYabin Cuitest ! -f world.tmp.zst  # symbolic link should not have been compressed!
991*01826a49SYabin Cuitest ! -f world2.tmp.zst  # symbolic link should not have been compressed!
992*01826a49SYabin Cuizstd world.tmp hello.tmp -f
993*01826a49SYabin Cuitest -f world.tmp.zst  # symbolic link should have been compressed with --force
994*01826a49SYabin Cuirm -f hello.tmp world.tmp world2.tmp hello.tmp.zst world.tmp.zst
995*01826a49SYabin Cui
996*01826a49SYabin Cuifi
997*01826a49SYabin Cui
998*01826a49SYabin Cui
999*01826a49SYabin Cuiprintln "\n===>  test sparse file support "
1000*01826a49SYabin Cui
1001*01826a49SYabin Cuidatagen -g5M  -P100 > tmpSparse
1002*01826a49SYabin Cuizstd tmpSparse -c | zstd -dv -o tmpSparseRegen
1003*01826a49SYabin Cui$DIFF -s tmpSparse tmpSparseRegen
1004*01826a49SYabin Cuizstd tmpSparse -c | zstd -dv --sparse -c > tmpOutSparse
1005*01826a49SYabin Cui$DIFF -s tmpSparse tmpOutSparse
1006*01826a49SYabin Cuizstd tmpSparse -c | zstd -dv --no-sparse -c > tmpOutNoSparse
1007*01826a49SYabin Cui$DIFF -s tmpSparse tmpOutNoSparse
1008*01826a49SYabin Cuils -ls tmpSparse*  # look at file size and block size on disk
1009*01826a49SYabin Cuidatagen -s1 -g1200007 -P100 | zstd | zstd -dv --sparse -c > tmpSparseOdd   # Odd size file (to not finish on an exact nb of blocks)
1010*01826a49SYabin Cuidatagen -s1 -g1200007 -P100 | $DIFF -s - tmpSparseOdd
1011*01826a49SYabin Cuils -ls tmpSparseOdd  # look at file size and block size on disk
1012*01826a49SYabin Cuiprintln "\n Sparse Compatibility with Console :"
1013*01826a49SYabin Cuiprintln "Hello World 1 !" | zstd | zstd -d -c
1014*01826a49SYabin Cuiprintln "Hello World 2 !" | zstd | zstd -d | cat
1015*01826a49SYabin Cuiprintln "\n Sparse Compatibility with Append :"
1016*01826a49SYabin Cuidatagen -P100 -g1M > tmpSparse1M
1017*01826a49SYabin Cuicat tmpSparse1M tmpSparse1M > tmpSparse2M
1018*01826a49SYabin Cuizstd -v -f tmpSparse1M -o tmpSparseCompressed
1019*01826a49SYabin Cuizstd -d -v -f tmpSparseCompressed -o tmpSparseRegenerated
1020*01826a49SYabin Cuizstd -d -v -f tmpSparseCompressed -c >> tmpSparseRegenerated
1021*01826a49SYabin Cuils -ls tmpSparse*  # look at file size and block size on disk
1022*01826a49SYabin Cui$DIFF tmpSparse2M tmpSparseRegenerated
1023*01826a49SYabin Cuirm -f tmpSparse*
1024*01826a49SYabin Cui
1025*01826a49SYabin Cui
1026*01826a49SYabin Cuiprintln "\n===>  stream-size mode"
1027*01826a49SYabin Cui
1028*01826a49SYabin Cuidatagen -g11000 > tmp
1029*01826a49SYabin Cuiprintln "test : basic file compression vs sized streaming compression"
1030*01826a49SYabin Cuifile_size=$(zstd -14 -f tmp -o tmp.zst && wc -c < tmp.zst)
1031*01826a49SYabin Cuistream_size=$(cat tmp | zstd -14 --stream-size=11000 | wc -c)
1032*01826a49SYabin Cuiif [ "$stream_size" -gt "$file_size" ]; then
1033*01826a49SYabin Cui  die "hinted compression larger than expected"
1034*01826a49SYabin Cuifi
1035*01826a49SYabin Cuiprintln "test : sized streaming compression and decompression"
1036*01826a49SYabin Cuicat tmp | zstd -14 -f tmp -o tmp.zst --stream-size=11000
1037*01826a49SYabin Cuizstd -df tmp.zst -o tmp_decompress
1038*01826a49SYabin Cuicmp tmp tmp_decompress || die "difference between original and decompressed file"
1039*01826a49SYabin Cuiprintln "test : incorrect stream size"
1040*01826a49SYabin Cuicat tmp | zstd -14 -f -o tmp.zst --stream-size=11001 && die "should fail with incorrect stream size"
1041*01826a49SYabin Cui
1042*01826a49SYabin Cuiprintln "\n===>  zstd zero weight dict test "
1043*01826a49SYabin Cuirm -f tmp*
1044*01826a49SYabin Cuicp "$TESTDIR/dict-files/zero-weight-dict" tmp_input
1045*01826a49SYabin Cuizstd -D "$TESTDIR/dict-files/zero-weight-dict" tmp_input
1046*01826a49SYabin Cuizstd -D "$TESTDIR/dict-files/zero-weight-dict" -d tmp_input.zst -o tmp_decomp
1047*01826a49SYabin Cui$DIFF tmp_decomp tmp_input
1048*01826a49SYabin Cuirm -rf tmp*
1049*01826a49SYabin Cui
1050*01826a49SYabin Cuiprintln "\n===>  zstd (valid) zero weight dict test "
1051*01826a49SYabin Cuirm -f tmp*
1052*01826a49SYabin Cui# 0 has a non-zero weight in the dictionary
1053*01826a49SYabin Cuiecho "0000000000000000000000000" > tmp_input
1054*01826a49SYabin Cuizstd -D "$TESTDIR/dict-files/zero-weight-dict" tmp_input
1055*01826a49SYabin Cuizstd -D "$TESTDIR/dict-files/zero-weight-dict" -d tmp_input.zst -o tmp_decomp
1056*01826a49SYabin Cui$DIFF tmp_decomp tmp_input
1057*01826a49SYabin Cuirm -rf tmp*
1058*01826a49SYabin Cui
1059*01826a49SYabin Cuiprintln "\n===>  size-hint mode"
1060*01826a49SYabin Cui
1061*01826a49SYabin Cuidatagen -g11000 > tmp
1062*01826a49SYabin Cuidatagen -g11000 > tmp2
1063*01826a49SYabin Cuidatagen > tmpDict
1064*01826a49SYabin Cuiprintln "test : basic file compression vs hinted streaming compression"
1065*01826a49SYabin Cuifile_size=$(zstd -14 -f tmp -o tmp.zst && wc -c < tmp.zst)
1066*01826a49SYabin Cuistream_size=$(cat tmp | zstd -14 --size-hint=11000 | wc -c)
1067*01826a49SYabin Cuiif [ "$stream_size" -ge "$file_size" ]; then
1068*01826a49SYabin Cui  die "hinted compression larger than expected"
1069*01826a49SYabin Cuifi
1070*01826a49SYabin Cuiprintln "test : hinted streaming compression and decompression"
1071*01826a49SYabin Cuicat tmp | zstd -14 -f -o tmp.zst --size-hint=11000
1072*01826a49SYabin Cuizstd -df tmp.zst -o tmp_decompress
1073*01826a49SYabin Cuicmp tmp tmp_decompress || die "difference between original and decompressed file"
1074*01826a49SYabin Cuiprintln "test : hinted streaming compression with dictionary"
1075*01826a49SYabin Cuicat tmp | zstd -14 -f -D tmpDict --size-hint=11000 | zstd -t -D tmpDict
1076*01826a49SYabin Cuiprintln "test : multiple file compression with hints and dictionary"
1077*01826a49SYabin Cuizstd -14 -f -D tmpDict --size-hint=11000 tmp tmp2
1078*01826a49SYabin Cuizstd -14 -f -o tmp1_.zst -D tmpDict --size-hint=11000 tmp
1079*01826a49SYabin Cuizstd -14 -f -o tmp2_.zst -D tmpDict --size-hint=11000 tmp2
1080*01826a49SYabin Cuicmp tmp.zst tmp1_.zst || die "first file's output differs"
1081*01826a49SYabin Cuicmp tmp2.zst tmp2_.zst || die "second file's output differs"
1082*01826a49SYabin Cuiprintln "test : incorrect hinted stream sizes"
1083*01826a49SYabin Cuicat tmp | zstd -14 -f --size-hint=11050 | zstd -t  # slightly too high
1084*01826a49SYabin Cuicat tmp | zstd -14 -f --size-hint=10950 | zstd -t  # slightly too low
1085*01826a49SYabin Cuicat tmp | zstd -14 -f --size-hint=22000 | zstd -t  # considerably too high
1086*01826a49SYabin Cuicat tmp | zstd -14 -f --size-hint=5500  | zstd -t  # considerably too low
1087*01826a49SYabin Cuiprintln "test : allows and interprets K,KB,KiB,M,MB and MiB suffix"
1088*01826a49SYabin Cuicat tmp | zstd -14 -f --size-hint=11K | zstd -t
1089*01826a49SYabin Cuicat tmp | zstd -14 -f --size-hint=11KB | zstd -t
1090*01826a49SYabin Cuicat tmp | zstd -14 -f --size-hint=11KiB | zstd -t
1091*01826a49SYabin Cuicat tmp | zstd -14 -f --size-hint=1M  | zstd -t
1092*01826a49SYabin Cuicat tmp | zstd -14 -f --size-hint=1MB  | zstd -t
1093*01826a49SYabin Cuicat tmp | zstd -14 -f --size-hint=1MiB  | zstd -t
1094*01826a49SYabin Cui
1095*01826a49SYabin Cui
1096*01826a49SYabin Cuiprintln "\n===>  dictionary tests "
1097*01826a49SYabin Cuiprintln "- Test high/low compressibility corpus training"
1098*01826a49SYabin Cuidatagen -g12M -P90 > tmpCorpusHighCompress
1099*01826a49SYabin Cuidatagen -g12M -P5 > tmpCorpusLowCompress
1100*01826a49SYabin Cuizstd --train -B2K tmpCorpusHighCompress -o tmpDictHighCompress
1101*01826a49SYabin Cuizstd --train -B2K tmpCorpusLowCompress -o tmpDictLowCompress
1102*01826a49SYabin Cuirm -f tmpCorpusHighCompress tmpCorpusLowCompress tmpDictHighCompress tmpDictLowCompress
1103*01826a49SYabin Cuiprintln "- Test with raw dict (content only) "
1104*01826a49SYabin Cuidatagen > tmpDict
1105*01826a49SYabin Cuidatagen -g1M | $MD5SUM > tmp1
1106*01826a49SYabin Cuidatagen -g1M | zstd -D tmpDict | zstd -D tmpDict -dvq | $MD5SUM > tmp2
1107*01826a49SYabin Cui$DIFF -q tmp1 tmp2
1108*01826a49SYabin Cuiprintln "- Create first dictionary "
1109*01826a49SYabin CuiTESTFILE="$PRGDIR"/zstdcli.c
1110*01826a49SYabin Cuizstd --train "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict
1111*01826a49SYabin Cuicp "$TESTFILE" tmp
1112*01826a49SYabin Cuiprintln "- Test dictionary compression with tmpDict as an input file and dictionary"
1113*01826a49SYabin Cuizstd -f tmpDict -D tmpDict && die "compression error not detected!"
1114*01826a49SYabin Cuiprintln "- Dictionary compression roundtrip"
1115*01826a49SYabin Cuizstd -f tmp -D tmpDict
1116*01826a49SYabin Cuizstd -d tmp.zst -D tmpDict -fo result
1117*01826a49SYabin Cui$DIFF "$TESTFILE" result
1118*01826a49SYabin Cuiprintln "- Dictionary compression with hlog < clog"
1119*01826a49SYabin Cuizstd -6f tmp -D tmpDict --zstd=clog=25,hlog=23
1120*01826a49SYabin Cuiprintln "- Dictionary compression with btlazy2 strategy"
1121*01826a49SYabin Cuizstd -f tmp -D tmpDict --zstd=strategy=6
1122*01826a49SYabin Cuizstd -d tmp.zst -D tmpDict -fo result
1123*01826a49SYabin Cui$DIFF "$TESTFILE" result
1124*01826a49SYabin Cuiif [ -e /proc/self/fd/0 ]; then
1125*01826a49SYabin Cui    println "- Test rejecting irregular dictionary file"
1126*01826a49SYabin Cui    cat tmpDict | zstd -f tmp -D /proc/self/fd/0 && die "Piped dictionary should fail!"
1127*01826a49SYabin Cui    cat tmpDict | zstd -d tmp.zst -D /proc/self/fd/0 -f && die "Piped dictionary should fail!"
1128*01826a49SYabin Cuifi
1129*01826a49SYabin Cuiif [ -n "$hasMT" ]
1130*01826a49SYabin Cuithen
1131*01826a49SYabin Cui    println "- Test dictionary compression with multithreading "
1132*01826a49SYabin Cui    datagen -g5M | zstd -T2 -D tmpDict | zstd -t -D tmpDict   # fails with v1.3.2
1133*01826a49SYabin Cuifi
1134*01826a49SYabin Cuiprintln "- Create second (different) dictionary "
1135*01826a49SYabin Cuizstd --train "$TESTDIR"/*.c "$PRGDIR"/*.c "$PRGDIR"/*.h -o tmpDictC
1136*01826a49SYabin Cuizstd -d tmp.zst -D tmpDictC -fo result && die "wrong dictionary not detected!"
1137*01826a49SYabin Cuiprintln "- Create dictionary with short dictID"
1138*01826a49SYabin Cuizstd --train "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID=1 -o tmpDict1
1139*01826a49SYabin Cuicmp tmpDict tmpDict1 && die "dictionaries should have different ID !"
1140*01826a49SYabin Cuiprintln "- Create dictionary with wrong dictID parameter order (must fail)"
1141*01826a49SYabin Cuizstd --train "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID -o 1 tmpDict1 && die "wrong order : --dictID must be followed by argument "
1142*01826a49SYabin Cuiprintln "- Create dictionary with size limit"
1143*01826a49SYabin Cuizstd --train "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict2 --maxdict=4K -v
1144*01826a49SYabin Cuiprintln "- Create dictionary with small size limit"
1145*01826a49SYabin Cuizstd --train "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict3 --maxdict=1K -v
1146*01826a49SYabin Cuiprintln "- Create dictionary with wrong parameter order (must fail)"
1147*01826a49SYabin Cuizstd --train "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict3 --maxdict -v 4K && die "wrong order : --maxdict must be followed by argument "
1148*01826a49SYabin Cuiprintln "- Compress without dictID"
1149*01826a49SYabin Cuizstd -f tmp -D tmpDict1 --no-dictID
1150*01826a49SYabin Cuizstd -d tmp.zst -D tmpDict -fo result
1151*01826a49SYabin Cui$DIFF "$TESTFILE" result
1152*01826a49SYabin Cuiprintln "- Compress multiple files with dictionary"
1153*01826a49SYabin Cuirm -rf dirTestDict
1154*01826a49SYabin Cuimkdir dirTestDict
1155*01826a49SYabin Cuicp "$TESTDIR"/*.c dirTestDict
1156*01826a49SYabin Cuicp "$PRGDIR"/*.c dirTestDict
1157*01826a49SYabin Cuicp "$PRGDIR"/*.h dirTestDict
1158*01826a49SYabin Cui$MD5SUM dirTestDict/* > tmph1
1159*01826a49SYabin Cuizstd -f --rm dirTestDict/* -D tmpDictC
1160*01826a49SYabin Cuizstd -d --rm dirTestDict/*.zst -D tmpDictC  # note : use internal checksum by default
1161*01826a49SYabin Cuicase "$UNAME" in
1162*01826a49SYabin Cui  Darwin) println "md5sum -c not supported on OS-X : test skipped" ;;  # not compatible with OS-X's md5
1163*01826a49SYabin Cui  *) $MD5SUM -c tmph1 ;;
1164*01826a49SYabin Cuiesac
1165*01826a49SYabin Cuirm -rf dirTestDict
1166*01826a49SYabin Cuiprintln "- dictionary builder on bogus input"
1167*01826a49SYabin Cuiprintln "Hello World" > tmp
1168*01826a49SYabin Cuizstd --train-legacy -q tmp && die "Dictionary training should fail : not enough input source"
1169*01826a49SYabin Cuidatagen -P0 -g10M > tmp
1170*01826a49SYabin Cuizstd --train-legacy -q tmp && die "Dictionary training should fail : source is pure noise"
1171*01826a49SYabin Cuiprintln "- Test -o before --train"
1172*01826a49SYabin Cuirm -f tmpDict dictionary
1173*01826a49SYabin Cuizstd -o tmpDict --train "$TESTDIR"/*.c "$PRGDIR"/*.c
1174*01826a49SYabin Cuitest -f tmpDict
1175*01826a49SYabin Cuizstd --train "$TESTDIR"/*.c "$PRGDIR"/*.c
1176*01826a49SYabin Cuitest -f dictionary
1177*01826a49SYabin Cuiif [ -n "$hasMT" ]
1178*01826a49SYabin Cuithen
1179*01826a49SYabin Cui  println "- Create dictionary with multithreading enabled"
1180*01826a49SYabin Cui  zstd --train -T0 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict
1181*01826a49SYabin Cuifi
1182*01826a49SYabin Cuirm -f tmp* dictionary
1183*01826a49SYabin Cui
1184*01826a49SYabin Cuiprintln "- Test --memory for dictionary compression"
1185*01826a49SYabin Cuidatagen -g12M -P90 > tmpCorpusHighCompress
1186*01826a49SYabin Cuizstd --train -B2K tmpCorpusHighCompress -o tmpDictHighCompress --memory=10K && die "Dictionary training should fail : --memory too low (10K)"
1187*01826a49SYabin Cuizstd --train -B2K tmpCorpusHighCompress -o tmpDictHighCompress --memory=5MB 2> zstTrainWithMemLimitStdErr
1188*01826a49SYabin Cuicat zstTrainWithMemLimitStdErr | $GREP "setting manual memory limit for dictionary training data at 5 MB"
1189*01826a49SYabin Cuicat zstTrainWithMemLimitStdErr | $GREP "Training samples set too large (12 MB); training on 5 MB only..."
1190*01826a49SYabin Cuirm zstTrainWithMemLimitStdErr
1191*01826a49SYabin Cui
1192*01826a49SYabin Cuiprintln "\n===>  fastCover dictionary builder : advanced options "
1193*01826a49SYabin CuiTESTFILE="$PRGDIR"/zstdcli.c
1194*01826a49SYabin Cuidatagen > tmpDict
1195*01826a49SYabin Cuiprintln "- Create first dictionary"
1196*01826a49SYabin Cuizstd --train-fastcover=k=46,d=8,f=15,split=80 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict
1197*01826a49SYabin Cuicp "$TESTFILE" tmp
1198*01826a49SYabin Cuizstd -f tmp -D tmpDict
1199*01826a49SYabin Cuizstd -d tmp.zst -D tmpDict -fo result
1200*01826a49SYabin Cui$DIFF "$TESTFILE" result
1201*01826a49SYabin Cuiprintln "- Create second (different) dictionary"
1202*01826a49SYabin Cuizstd --train-fastcover=k=56,d=8 "$TESTDIR"/*.c "$PRGDIR"/*.c "$PRGDIR"/*.h -o tmpDictC
1203*01826a49SYabin Cuizstd -d tmp.zst -D tmpDictC -fo result && die "wrong dictionary not detected!"
1204*01826a49SYabin Cuizstd --train-fastcover=k=56,d=8 && die "Create dictionary without input file"
1205*01826a49SYabin Cuiprintln "- Create dictionary with short dictID"
1206*01826a49SYabin Cuizstd --train-fastcover=k=46,d=8,f=15,split=80 "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID=1 -o tmpDict1
1207*01826a49SYabin Cuicmp tmpDict tmpDict1 && die "dictionaries should have different ID !"
1208*01826a49SYabin Cuiprintln "- Create dictionaries with shrink-dict flag enabled"
1209*01826a49SYabin Cuizstd --train-fastcover=steps=1,shrink "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpShrinkDict
1210*01826a49SYabin Cuizstd --train-fastcover=steps=1,shrink=1 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpShrinkDict1
1211*01826a49SYabin Cuizstd --train-fastcover=steps=1,shrink=5 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpShrinkDict2
1212*01826a49SYabin Cuizstd --train-fastcover=shrink=5,steps=1 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpShrinkDict3
1213*01826a49SYabin Cuiprintln "- Create dictionary with size limit"
1214*01826a49SYabin Cuizstd --train-fastcover=steps=1 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict2 --maxdict=4K
1215*01826a49SYabin Cuiprintln "- Create dictionary using all samples for both training and testing"
1216*01826a49SYabin Cuizstd --train-fastcover=k=56,d=8,split=100 -r "$TESTDIR"/*.c "$PRGDIR"/*.c
1217*01826a49SYabin Cuiprintln "- Create dictionary using f=16"
1218*01826a49SYabin Cuizstd --train-fastcover=k=56,d=8,f=16 -r "$TESTDIR"/*.c "$PRGDIR"/*.c
1219*01826a49SYabin Cuizstd --train-fastcover=k=56,d=8,accel=15 -r "$TESTDIR"/*.c "$PRGDIR"/*.c && die "Created dictionary using accel=15"
1220*01826a49SYabin Cuiprintln "- Create dictionary using accel=2"
1221*01826a49SYabin Cuizstd --train-fastcover=k=56,d=8,accel=2 -r "$TESTDIR"/*.c "$PRGDIR"/*.c
1222*01826a49SYabin Cuiprintln "- Create dictionary using accel=10"
1223*01826a49SYabin Cuizstd --train-fastcover=k=56,d=8,accel=10 -r "$TESTDIR"/*.c "$PRGDIR"/*.c
1224*01826a49SYabin Cuiprintln "- Create dictionary with multithreading"
1225*01826a49SYabin Cuizstd --train-fastcover -T4 -r "$TESTDIR"/*.c "$PRGDIR"/*.c
1226*01826a49SYabin Cuiprintln "- Test -o before --train-fastcover"
1227*01826a49SYabin Cuirm -f tmpDict dictionary
1228*01826a49SYabin Cuizstd -o tmpDict --train-fastcover=k=56,d=8 "$TESTDIR"/*.c "$PRGDIR"/*.c
1229*01826a49SYabin Cuitest -f tmpDict
1230*01826a49SYabin Cuizstd --train-fastcover=k=56,d=8 "$TESTDIR"/*.c "$PRGDIR"/*.c
1231*01826a49SYabin Cuitest -f dictionary
1232*01826a49SYabin Cuirm -f tmp* dictionary
1233*01826a49SYabin Cui
1234*01826a49SYabin Cui
1235*01826a49SYabin Cuiprintln "\n===>  legacy dictionary builder "
1236*01826a49SYabin Cui
1237*01826a49SYabin CuiTESTFILE="$PRGDIR"/zstdcli.c
1238*01826a49SYabin Cuidatagen > tmpDict
1239*01826a49SYabin Cuiprintln "- Create first dictionary"
1240*01826a49SYabin Cuizstd --train-legacy=selectivity=8 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict
1241*01826a49SYabin Cuicp "$TESTFILE" tmp
1242*01826a49SYabin Cuizstd -f tmp -D tmpDict
1243*01826a49SYabin Cuizstd -d tmp.zst -D tmpDict -fo result
1244*01826a49SYabin Cui$DIFF "$TESTFILE" result
1245*01826a49SYabin Cuizstd --train-legacy=s=8 && die "Create dictionary without input files (should error)"
1246*01826a49SYabin Cuiprintln "- Create second (different) dictionary"
1247*01826a49SYabin Cuizstd --train-legacy=s=5 "$TESTDIR"/*.c "$PRGDIR"/*.c "$PRGDIR"/*.h -o tmpDictC
1248*01826a49SYabin Cuizstd -d tmp.zst -D tmpDictC -fo result && die "wrong dictionary not detected!"
1249*01826a49SYabin Cuiprintln "- Create dictionary with short dictID"
1250*01826a49SYabin Cuizstd --train-legacy -s5 "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID=1 -o tmpDict1
1251*01826a49SYabin Cuicmp tmpDict tmpDict1 && die "dictionaries should have different ID !"
1252*01826a49SYabin Cuiprintln "- Create dictionary with size limit"
1253*01826a49SYabin Cuizstd --train-legacy -s9 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict2 --maxdict=4K
1254*01826a49SYabin Cuiprintln "- Test -o before --train-legacy"
1255*01826a49SYabin Cuirm -f tmpDict dictionary
1256*01826a49SYabin Cuizstd -o tmpDict --train-legacy "$TESTDIR"/*.c "$PRGDIR"/*.c
1257*01826a49SYabin Cuitest -f tmpDict
1258*01826a49SYabin Cuizstd --train-legacy "$TESTDIR"/*.c "$PRGDIR"/*.c
1259*01826a49SYabin Cuitest -f dictionary
1260*01826a49SYabin Cuirm -f tmp* dictionary
1261*01826a49SYabin Cui
1262*01826a49SYabin Cui
1263*01826a49SYabin Cuiprintln "\n===>  integrity tests "
1264*01826a49SYabin Cui
1265*01826a49SYabin Cuiprintln "test one file (tmp1.zst) "
1266*01826a49SYabin Cuidatagen > tmp1
1267*01826a49SYabin Cuizstd tmp1
1268*01826a49SYabin Cuizstd -t tmp1.zst
1269*01826a49SYabin Cuizstd --test tmp1.zst
1270*01826a49SYabin Cuiprintln "test multiple files (*.zst) "
1271*01826a49SYabin Cuizstd -t ./*.zst
1272*01826a49SYabin Cuiprintln "test bad files (*) "
1273*01826a49SYabin Cuizstd -t ./* && die "bad files not detected !"
1274*01826a49SYabin Cuizstd -t tmp1 && die "bad file not detected !"
1275*01826a49SYabin Cuicp tmp1 tmp2.zst
1276*01826a49SYabin Cuizstd -t tmp2.zst && die "bad file not detected !"
1277*01826a49SYabin Cuidatagen -g0 > tmp3
1278*01826a49SYabin Cuizstd -t tmp3 && die "bad file not detected !"   # detects 0-sized files as bad
1279*01826a49SYabin Cuiprintln "test --rm and --test combined "
1280*01826a49SYabin Cuizstd -t --rm tmp1.zst
1281*01826a49SYabin Cuitest -f tmp1.zst   # check file is still present
1282*01826a49SYabin Cuicp tmp1.zst tmp2.zst
1283*01826a49SYabin Cuizstd -t tmp1.zst tmp2.zst --rm
1284*01826a49SYabin Cuitest -f tmp1.zst   # check file is still present
1285*01826a49SYabin Cuitest -f tmp2.zst   # check file is still present
1286*01826a49SYabin Cuisplit -b16384 tmp1.zst tmpSplit.
1287*01826a49SYabin Cuizstd -t tmpSplit.* && die "bad file not detected !"
1288*01826a49SYabin Cuidatagen | zstd -c | zstd -t
1289*01826a49SYabin Cui
1290*01826a49SYabin Cui
1291*01826a49SYabin Cuiprintln "\n===>  golden files tests "
1292*01826a49SYabin Cui
1293*01826a49SYabin Cuizstd -t -r "$TESTDIR/golden-decompression"
1294*01826a49SYabin Cuizstd -c -r "$TESTDIR/golden-compression" | zstd -t
1295*01826a49SYabin Cuizstd -D "$TESTDIR/golden-dictionaries/http-dict-missing-symbols" "$TESTDIR/golden-compression/http" -c | zstd -D "$TESTDIR/golden-dictionaries/http-dict-missing-symbols" -t
1296*01826a49SYabin Cui
1297*01826a49SYabin Cui
1298*01826a49SYabin Cuiprintln "\n===>  benchmark mode tests "
1299*01826a49SYabin Cui
1300*01826a49SYabin Cuiprintln "bench one file"
1301*01826a49SYabin Cuidatagen > tmp1
1302*01826a49SYabin Cuizstd -bi0 tmp1
1303*01826a49SYabin Cuiprintln "bench multiple levels"
1304*01826a49SYabin Cuizstd -i0b0e3 tmp1
1305*01826a49SYabin Cuiprintln "bench negative level"
1306*01826a49SYabin Cuizstd -bi0 --fast tmp1
1307*01826a49SYabin Cuiprintln "with recursive and quiet modes"
1308*01826a49SYabin Cuizstd -rqi0b1e2 tmp1
1309*01826a49SYabin Cuiprintln "benchmark decompression only"
1310*01826a49SYabin Cuizstd -f tmp1
1311*01826a49SYabin Cuizstd -b -d -i0 tmp1.zst
1312*01826a49SYabin Cuiprintln "benchmark can fail - decompression on invalid data"
1313*01826a49SYabin Cuizstd -b -d -i0 tmp1 && die "invalid .zst data => benchmark should have failed"
1314*01826a49SYabin Cui
1315*01826a49SYabin CuiGZIPMODE=1
1316*01826a49SYabin Cuizstd --format=gzip -V || GZIPMODE=0
1317*01826a49SYabin Cuiif [ $GZIPMODE -eq 1 ]; then
1318*01826a49SYabin Cui    println "benchmark mode is only compatible with zstd"
1319*01826a49SYabin Cui    zstd --format=gzip -b tmp1 && die "-b should be incompatible with gzip format!"
1320*01826a49SYabin Cuifi
1321*01826a49SYabin Cui
1322*01826a49SYabin Cuiprintln "\n===>  zstd compatibility tests "
1323*01826a49SYabin Cui
1324*01826a49SYabin Cuidatagen > tmp
1325*01826a49SYabin Cuirm -f tmp.zst
1326*01826a49SYabin Cuizstd --format=zstd -f tmp
1327*01826a49SYabin Cuitest -f tmp.zst
1328*01826a49SYabin Cui
1329*01826a49SYabin Cui
1330*01826a49SYabin Cuiprintln "\n===>  gzip compatibility tests "
1331*01826a49SYabin Cui
1332*01826a49SYabin CuiGZIPMODE=1
1333*01826a49SYabin Cuizstd --format=gzip -V || GZIPMODE=0
1334*01826a49SYabin Cuiif [ $GZIPMODE -eq 1 ]; then
1335*01826a49SYabin Cui    println "gzip support detected"
1336*01826a49SYabin Cui    GZIPEXE=1
1337*01826a49SYabin Cui    gzip -V || GZIPEXE=0
1338*01826a49SYabin Cui    if [ $GZIPEXE -eq 1 ]; then
1339*01826a49SYabin Cui        datagen > tmp
1340*01826a49SYabin Cui        zstd --format=gzip -f tmp
1341*01826a49SYabin Cui        gzip -t -v tmp.gz
1342*01826a49SYabin Cui        gzip -f tmp
1343*01826a49SYabin Cui        zstd -d -f -v tmp.gz
1344*01826a49SYabin Cui        rm -f tmp*
1345*01826a49SYabin Cui    else
1346*01826a49SYabin Cui        println "gzip binary not detected"
1347*01826a49SYabin Cui    fi
1348*01826a49SYabin Cuielse
1349*01826a49SYabin Cui    println "gzip mode not supported"
1350*01826a49SYabin Cuifi
1351*01826a49SYabin Cui
1352*01826a49SYabin Cui
1353*01826a49SYabin Cuiprintln "\n===>  gzip frame tests "
1354*01826a49SYabin Cui
1355*01826a49SYabin Cuiif [ $GZIPMODE -eq 1 ]; then
1356*01826a49SYabin Cui    datagen > tmp
1357*01826a49SYabin Cui    zstd -f --format=gzip tmp
1358*01826a49SYabin Cui    zstd -f tmp
1359*01826a49SYabin Cui    cat tmp.gz tmp.zst tmp.gz tmp.zst | zstd -d -f -o tmp
1360*01826a49SYabin Cui    truncateLastByte tmp.gz | zstd -t > $INTOVOID && die "incomplete frame not detected !"
1361*01826a49SYabin Cui    rm -f tmp*
1362*01826a49SYabin Cuielse
1363*01826a49SYabin Cui    println "gzip mode not supported"
1364*01826a49SYabin Cuifi
1365*01826a49SYabin Cui
1366*01826a49SYabin Cuiif [ $GZIPMODE -eq 1 ]; then
1367*01826a49SYabin Cui    datagen > tmp
1368*01826a49SYabin Cui    rm -f tmp.zst
1369*01826a49SYabin Cui    zstd --format=gzip --format=zstd -f tmp
1370*01826a49SYabin Cui    test -f tmp.zst
1371*01826a49SYabin Cuifi
1372*01826a49SYabin Cui
1373*01826a49SYabin Cuiprintln "\n===>  xz compatibility tests "
1374*01826a49SYabin Cui
1375*01826a49SYabin CuiLZMAMODE=1
1376*01826a49SYabin Cuizstd --format=xz -V || LZMAMODE=0
1377*01826a49SYabin Cuiif [ $LZMAMODE -eq 1 ]; then
1378*01826a49SYabin Cui    println "xz support detected"
1379*01826a49SYabin Cui    XZEXE=1
1380*01826a49SYabin Cui    xz -Q -V && lzma -Q -V || XZEXE=0
1381*01826a49SYabin Cui    if [ $XZEXE -eq 1 ]; then
1382*01826a49SYabin Cui        println "Testing zstd xz and lzma support"
1383*01826a49SYabin Cui        datagen > tmp
1384*01826a49SYabin Cui        zstd --format=lzma -f tmp
1385*01826a49SYabin Cui        zstd --format=xz -f tmp
1386*01826a49SYabin Cui        xz -Q -t -v tmp.xz
1387*01826a49SYabin Cui        xz -Q -t -v tmp.lzma
1388*01826a49SYabin Cui        xz -Q -f -k tmp
1389*01826a49SYabin Cui        lzma -Q -f -k --lzma1 tmp
1390*01826a49SYabin Cui        zstd -d -f -v tmp.xz
1391*01826a49SYabin Cui        zstd -d -f -v tmp.lzma
1392*01826a49SYabin Cui        rm -f tmp*
1393*01826a49SYabin Cui        println "Creating symlinks"
1394*01826a49SYabin Cui        ln -s "$ZSTD_BIN" ./xz
1395*01826a49SYabin Cui        ln -s "$ZSTD_BIN" ./unxz
1396*01826a49SYabin Cui        ln -s "$ZSTD_BIN" ./lzma
1397*01826a49SYabin Cui        ln -s "$ZSTD_BIN" ./unlzma
1398*01826a49SYabin Cui        println "Testing xz and lzma symlinks"
1399*01826a49SYabin Cui        datagen > tmp
1400*01826a49SYabin Cui        ./xz tmp
1401*01826a49SYabin Cui        xz -Q -d tmp.xz
1402*01826a49SYabin Cui        ./lzma tmp
1403*01826a49SYabin Cui        lzma -Q -d tmp.lzma
1404*01826a49SYabin Cui        println "Testing unxz and unlzma symlinks"
1405*01826a49SYabin Cui        xz -Q tmp
1406*01826a49SYabin Cui        ./xz -d tmp.xz
1407*01826a49SYabin Cui        lzma -Q tmp
1408*01826a49SYabin Cui        ./lzma -d tmp.lzma
1409*01826a49SYabin Cui        rm -f xz unxz lzma unlzma
1410*01826a49SYabin Cui        rm -f tmp*
1411*01826a49SYabin Cui    else
1412*01826a49SYabin Cui        println "xz binary not detected"
1413*01826a49SYabin Cui    fi
1414*01826a49SYabin Cuielse
1415*01826a49SYabin Cui    println "xz mode not supported"
1416*01826a49SYabin Cuifi
1417*01826a49SYabin Cui
1418*01826a49SYabin Cui
1419*01826a49SYabin Cuiprintln "\n===>  xz frame tests "
1420*01826a49SYabin Cui
1421*01826a49SYabin Cuiif [ $LZMAMODE -eq 1 ]; then
1422*01826a49SYabin Cui    datagen > tmp
1423*01826a49SYabin Cui    zstd -f --format=xz tmp
1424*01826a49SYabin Cui    zstd -f --format=lzma tmp
1425*01826a49SYabin Cui    zstd -f tmp
1426*01826a49SYabin Cui    cat tmp.xz tmp.lzma tmp.zst tmp.lzma tmp.xz tmp.zst | zstd -d -f -o tmp
1427*01826a49SYabin Cui    truncateLastByte tmp.xz | zstd -t > $INTOVOID && die "incomplete frame not detected !"
1428*01826a49SYabin Cui    truncateLastByte tmp.lzma | zstd -t > $INTOVOID && die "incomplete frame not detected !"
1429*01826a49SYabin Cui    rm -f tmp*
1430*01826a49SYabin Cuielse
1431*01826a49SYabin Cui    println "xz mode not supported"
1432*01826a49SYabin Cuifi
1433*01826a49SYabin Cui
1434*01826a49SYabin Cuiprintln "\n===>  lz4 compatibility tests "
1435*01826a49SYabin Cui
1436*01826a49SYabin CuiLZ4MODE=1
1437*01826a49SYabin Cuizstd --format=lz4 -V || LZ4MODE=0
1438*01826a49SYabin Cuiif [ $LZ4MODE -eq 1 ]; then
1439*01826a49SYabin Cui    println "lz4 support detected"
1440*01826a49SYabin Cui    LZ4EXE=1
1441*01826a49SYabin Cui    lz4 -V || LZ4EXE=0
1442*01826a49SYabin Cui    if [ $LZ4EXE -eq 1 ]; then
1443*01826a49SYabin Cui        datagen > tmp
1444*01826a49SYabin Cui        zstd --format=lz4 -f tmp
1445*01826a49SYabin Cui        lz4 -t -v tmp.lz4
1446*01826a49SYabin Cui        lz4 -f -m tmp   # ensure result is sent into tmp.lz4, not stdout
1447*01826a49SYabin Cui        zstd -d -f -v tmp.lz4
1448*01826a49SYabin Cui        rm -f tmp*
1449*01826a49SYabin Cui    else
1450*01826a49SYabin Cui        println "lz4 binary not detected"
1451*01826a49SYabin Cui    fi
1452*01826a49SYabin Cuielse
1453*01826a49SYabin Cui    println "lz4 mode not supported"
1454*01826a49SYabin Cuifi
1455*01826a49SYabin Cui
1456*01826a49SYabin Cui
1457*01826a49SYabin Cuiif [ $LZ4MODE -eq 1 ]; then
1458*01826a49SYabin Cui    println "\n===>  lz4 frame tests "
1459*01826a49SYabin Cui    datagen > tmp
1460*01826a49SYabin Cui    zstd -f --format=lz4 tmp
1461*01826a49SYabin Cui    zstd -f tmp
1462*01826a49SYabin Cui    cat tmp.lz4 tmp.zst tmp.lz4 tmp.zst | zstd -d -f -o tmp
1463*01826a49SYabin Cui    truncateLastByte tmp.lz4 | zstd -t > $INTOVOID && die "incomplete frame not detected !"
1464*01826a49SYabin Cui    rm -f tmp*
1465*01826a49SYabin Cuielse
1466*01826a49SYabin Cui    println "\nlz4 mode not supported"
1467*01826a49SYabin Cuifi
1468*01826a49SYabin Cui
1469*01826a49SYabin Cui
1470*01826a49SYabin Cuiprintln "\n===> suffix list test"
1471*01826a49SYabin Cui
1472*01826a49SYabin Cui! zstd -d tmp.abc 2> tmplg
1473*01826a49SYabin Cui
1474*01826a49SYabin Cuiif [ $GZIPMODE -ne 1 ]; then
1475*01826a49SYabin Cui    $GREP ".gz" tmplg > $INTOVOID && die "Unsupported suffix listed"
1476*01826a49SYabin Cuifi
1477*01826a49SYabin Cui
1478*01826a49SYabin Cuiif [ $LZMAMODE -ne 1 ]; then
1479*01826a49SYabin Cui    $GREP ".lzma" tmplg > $INTOVOID && die "Unsupported suffix listed"
1480*01826a49SYabin Cui    $GREP ".xz" tmplg > $INTOVOID && die "Unsupported suffix listed"
1481*01826a49SYabin Cuifi
1482*01826a49SYabin Cui
1483*01826a49SYabin Cuiif [ $LZ4MODE -ne 1 ]; then
1484*01826a49SYabin Cui    $GREP ".lz4" tmplg > $INTOVOID && die "Unsupported suffix listed"
1485*01826a49SYabin Cuifi
1486*01826a49SYabin Cui
1487*01826a49SYabin Cuitouch tmp1
1488*01826a49SYabin Cuizstd tmp1 -o tmp1.zstd
1489*01826a49SYabin Cuizstd -d -f tmp1.zstd   # support .zstd suffix even though it's not the default suffix
1490*01826a49SYabin Cui
1491*01826a49SYabin Cuiprintln "\n===>  tar extension tests "
1492*01826a49SYabin Cui
1493*01826a49SYabin Cuirm -f tmp tmp.tar tmp.tzst tmp.tgz tmp.txz tmp.tlz4 tmp1.zstd
1494*01826a49SYabin Cui
1495*01826a49SYabin Cuidatagen > tmp
1496*01826a49SYabin Cuitar -cf tmp.tar tmp
1497*01826a49SYabin Cuizstd tmp.tar -o tmp.tzst
1498*01826a49SYabin Cuirm -f tmp.tar
1499*01826a49SYabin Cuizstd -d tmp.tzst
1500*01826a49SYabin Cui[ -e tmp.tar ] || die ".tzst failed to decompress to .tar!"
1501*01826a49SYabin Cuirm -f tmp.tar tmp.tzst
1502*01826a49SYabin Cui
1503*01826a49SYabin Cuiif [ $GZIPMODE -eq 1 ]; then
1504*01826a49SYabin Cui    tar -f - -c tmp | gzip > tmp.tgz
1505*01826a49SYabin Cui    zstd -d tmp.tgz
1506*01826a49SYabin Cui    [ -e tmp.tar ] || die ".tgz failed to decompress to .tar!"
1507*01826a49SYabin Cui    rm -f tmp.tar tmp.tgz
1508*01826a49SYabin Cuifi
1509*01826a49SYabin Cui
1510*01826a49SYabin Cuiif [ $LZMAMODE -eq 1 ]; then
1511*01826a49SYabin Cui    tar -f - -c tmp | zstd --format=xz > tmp.txz
1512*01826a49SYabin Cui    zstd -d tmp.txz
1513*01826a49SYabin Cui    [ -e tmp.tar ] || die ".txz failed to decompress to .tar!"
1514*01826a49SYabin Cui    rm -f tmp.tar tmp.txz
1515*01826a49SYabin Cuifi
1516*01826a49SYabin Cui
1517*01826a49SYabin Cuiif [ $LZ4MODE -eq 1 ]; then
1518*01826a49SYabin Cui    tar -f - -c tmp | zstd --format=lz4 > tmp.tlz4
1519*01826a49SYabin Cui    zstd -d tmp.tlz4
1520*01826a49SYabin Cui    [ -e tmp.tar ] || die ".tlz4 failed to decompress to .tar!"
1521*01826a49SYabin Cui    rm -f tmp.tar tmp.tlz4
1522*01826a49SYabin Cuifi
1523*01826a49SYabin Cui
1524*01826a49SYabin Cuitouch tmp.t tmp.tz tmp.tzs
1525*01826a49SYabin Cui! zstd -d tmp.t
1526*01826a49SYabin Cui! zstd -d tmp.tz
1527*01826a49SYabin Cui! zstd -d tmp.tzs
1528*01826a49SYabin Cui
1529*01826a49SYabin Cui
1530*01826a49SYabin Cuiprintln "\n===>  zstd round-trip tests "
1531*01826a49SYabin Cui
1532*01826a49SYabin CuiroundTripTest
1533*01826a49SYabin CuiroundTripTest -g15K       # TableID==3
1534*01826a49SYabin CuiroundTripTest -g127K      # TableID==2
1535*01826a49SYabin CuiroundTripTest -g255K      # TableID==1
1536*01826a49SYabin CuiroundTripTest -g522K      # TableID==0
1537*01826a49SYabin CuiroundTripTest -g519K 6    # greedy, hash chain
1538*01826a49SYabin CuiroundTripTest -g517K 16   # btlazy2
1539*01826a49SYabin CuiroundTripTest -g516K 19   # btopt
1540*01826a49SYabin Cui
1541*01826a49SYabin CuifileRoundTripTest -g500K
1542*01826a49SYabin Cui
1543*01826a49SYabin Cuiprintln "\n===>  zstd long distance matching round-trip tests "
1544*01826a49SYabin CuiroundTripTest -g0 "2 --single-thread --long"
1545*01826a49SYabin CuiroundTripTest -g1000K "1 --single-thread --long"
1546*01826a49SYabin CuiroundTripTest -g517K "6 --single-thread --long"
1547*01826a49SYabin CuiroundTripTest -g516K "16 --single-thread --long"
1548*01826a49SYabin CuiroundTripTest -g518K "19 --single-thread --long"
1549*01826a49SYabin CuiroundTripTest -g2M "22 --single-thread --ultra --long"
1550*01826a49SYabin CuifileRoundTripTest -g5M "3 --single-thread --long"
1551*01826a49SYabin Cui
1552*01826a49SYabin Cui
1553*01826a49SYabin CuiroundTripTest -g96K "5 --single-thread"
1554*01826a49SYabin Cuiif [ -n "$hasMT" ]
1555*01826a49SYabin Cuithen
1556*01826a49SYabin Cui    println "\n===>  zstdmt round-trip tests "
1557*01826a49SYabin Cui    roundTripTest -g4M "1 -T0"
1558*01826a49SYabin Cui    roundTripTest -g4M "1 -T0 --auto-threads=physical"
1559*01826a49SYabin Cui    roundTripTest -g4M "1 -T0 --auto-threads=logical"
1560*01826a49SYabin Cui    roundTripTest -g8M "3 -T2"
1561*01826a49SYabin Cui    roundTripTest -g8M "19 --long"
1562*01826a49SYabin Cui    roundTripTest -g8000K "2 --threads=2"
1563*01826a49SYabin Cui    fileRoundTripTest -g4M "19 -T2 -B1M"
1564*01826a49SYabin Cui
1565*01826a49SYabin Cui    println "\n===>  zstdmt long distance matching round-trip tests "
1566*01826a49SYabin Cui    roundTripTest -g8M "3 --long=24 -T2"
1567*01826a49SYabin Cui
1568*01826a49SYabin Cui    println "\n===>  zstdmt environment variable tests "
1569*01826a49SYabin Cui    echo "multifoo" >> mt_tmp
1570*01826a49SYabin Cui    ZSTD_NBTHREADS=-3 zstd -f mt_tmp # negative value, warn and revert to default setting
1571*01826a49SYabin Cui    ZSTD_NBTHREADS=''  zstd -f mt_tmp # empty env var, warn and revert to default setting
1572*01826a49SYabin Cui    ZSTD_NBTHREADS=-   zstd -f mt_tmp # malformed env var, warn and revert to default setting
1573*01826a49SYabin Cui    ZSTD_NBTHREADS=a   zstd -f mt_tmp # malformed env var, warn and revert to default setting
1574*01826a49SYabin Cui    ZSTD_NBTHREADS=+a  zstd -f mt_tmp # malformed env var, warn and revert to default setting
1575*01826a49SYabin Cui    ZSTD_NBTHREADS=3a7 zstd -f mt_tmp # malformed env var, warn and revert to default setting
1576*01826a49SYabin Cui    ZSTD_NBTHREADS=50000000000 zstd -f mt_tmp # numeric value too large, warn and revert to default setting=
1577*01826a49SYabin Cui    ZSTD_NBTHREADS=2  zstd -f mt_tmp # correct usage
1578*01826a49SYabin Cui    ZSTD_NBTHREADS=1  zstd -f mt_tmp # correct usage: single thread
1579*01826a49SYabin Cui    # temporary envvar changes in the above tests would actually persist in macos /bin/sh
1580*01826a49SYabin Cui    unset ZSTD_NBTHREADS
1581*01826a49SYabin Cui    rm -f mt_tmp*
1582*01826a49SYabin Cui
1583*01826a49SYabin Cui    println "\n===>  ovLog tests "
1584*01826a49SYabin Cui    datagen -g2MB > tmp
1585*01826a49SYabin Cui    refSize=$(zstd tmp -6 -c --zstd=wlog=18         | wc -c)
1586*01826a49SYabin Cui    ov9Size=$(zstd tmp -6 -c --zstd=wlog=18,ovlog=9 | wc -c)
1587*01826a49SYabin Cui    ov1Size=$(zstd tmp -6 -c --zstd=wlog=18,ovlog=1 | wc -c)
1588*01826a49SYabin Cui    if [ "$refSize" -eq "$ov9Size" ]; then
1589*01826a49SYabin Cui        echo ov9Size should be different from refSize
1590*01826a49SYabin Cui        exit 1
1591*01826a49SYabin Cui    fi
1592*01826a49SYabin Cui    if [ "$refSize" -eq "$ov1Size" ]; then
1593*01826a49SYabin Cui        echo ov1Size should be different from refSize
1594*01826a49SYabin Cui        exit 1
1595*01826a49SYabin Cui    fi
1596*01826a49SYabin Cui    if [ "$ov9Size" -ge "$ov1Size" ]; then
1597*01826a49SYabin Cui        echo ov9Size="$ov9Size" should be smaller than ov1Size="$ov1Size"
1598*01826a49SYabin Cui        exit 1
1599*01826a49SYabin Cui    fi
1600*01826a49SYabin Cui
1601*01826a49SYabin Cuielse
1602*01826a49SYabin Cui    println "\n===>  no multithreading, skipping zstdmt tests "
1603*01826a49SYabin Cuifi
1604*01826a49SYabin Cui
1605*01826a49SYabin Cuirm -f tmp*
1606*01826a49SYabin Cui
1607*01826a49SYabin Cuiprintln "\n===>  zstd --list/-l single frame tests "
1608*01826a49SYabin Cuidatagen > tmp1
1609*01826a49SYabin Cuidatagen > tmp2
1610*01826a49SYabin Cuidatagen > tmp3
1611*01826a49SYabin Cuizstd tmp*
1612*01826a49SYabin Cuizstd -l ./*.zst
1613*01826a49SYabin Cuizstd -lv ./*.zst | $GREP "Decompressed Size:"  # check that decompressed size is present in header
1614*01826a49SYabin Cuizstd --list ./*.zst
1615*01826a49SYabin Cuizstd --list -v ./*.zst
1616*01826a49SYabin Cui
1617*01826a49SYabin Cuiprintln "\n===>  zstd --list/-l multiple frame tests "
1618*01826a49SYabin Cuicat tmp1.zst tmp2.zst > tmp12.zst
1619*01826a49SYabin Cuicat tmp12.zst tmp3.zst > tmp123.zst
1620*01826a49SYabin Cuizstd -l ./*.zst
1621*01826a49SYabin Cuizstd -lv ./*.zst
1622*01826a49SYabin Cui
1623*01826a49SYabin Cuiprintln "\n===>  zstd --list/-l error detection tests "
1624*01826a49SYabin Cuizstd -l tmp1 tmp1.zst && die "-l must fail on non-zstd file"
1625*01826a49SYabin Cuizstd --list tmp* && die "-l must fail on non-zstd file"
1626*01826a49SYabin Cuizstd -lv tmp1* && die "-l must fail on non-zstd file"
1627*01826a49SYabin Cuizstd --list -v tmp2 tmp12.zst && die "-l must fail on non-zstd file"
1628*01826a49SYabin Cui
1629*01826a49SYabin Cuiprintln "test : detect truncated compressed file "
1630*01826a49SYabin CuiTEST_DATA_FILE=truncatable-input.txt
1631*01826a49SYabin CuiFULL_COMPRESSED_FILE=${TEST_DATA_FILE}.zst
1632*01826a49SYabin CuiTRUNCATED_COMPRESSED_FILE=truncated-input.txt.zst
1633*01826a49SYabin Cuidatagen -g50000 > $TEST_DATA_FILE
1634*01826a49SYabin Cuizstd -f $TEST_DATA_FILE -o $FULL_COMPRESSED_FILE
1635*01826a49SYabin Cuidd bs=1 count=100 if=$FULL_COMPRESSED_FILE of=$TRUNCATED_COMPRESSED_FILE
1636*01826a49SYabin Cuizstd --list $TRUNCATED_COMPRESSED_FILE && die "-l must fail on truncated file"
1637*01826a49SYabin Cui
1638*01826a49SYabin Cuirm -f $TEST_DATA_FILE
1639*01826a49SYabin Cuirm -f $FULL_COMPRESSED_FILE
1640*01826a49SYabin Cuirm -f $TRUNCATED_COMPRESSED_FILE
1641*01826a49SYabin Cui
1642*01826a49SYabin Cuiprintln "\n===>  zstd --list/-l errors when presented with stdin / no files"
1643*01826a49SYabin Cuizstd -l && die "-l must fail on empty list of files"
1644*01826a49SYabin Cuizstd -l - && die "-l does not work on stdin"
1645*01826a49SYabin Cuizstd -l < tmp1.zst && die "-l does not work on stdin"
1646*01826a49SYabin Cuizstd -l - < tmp1.zst && die "-l does not work on stdin"
1647*01826a49SYabin Cuizstd -l - tmp1.zst && die "-l does not work on stdin"
1648*01826a49SYabin Cuizstd -l - tmp1.zst < tmp1.zst && die "-l does not work on stdin"
1649*01826a49SYabin Cuizstd -l tmp1.zst < tmp2.zst # this will check tmp1.zst, but not tmp2.zst, which is not an error : zstd simply doesn't read stdin in this case. It must not error just because stdin is not a tty
1650*01826a49SYabin Cui
1651*01826a49SYabin Cuiprintln "\n===>  zstd --list/-l test with null files "
1652*01826a49SYabin Cuidatagen -g0 > tmp5
1653*01826a49SYabin Cuizstd tmp5
1654*01826a49SYabin Cuizstd -l tmp5.zst
1655*01826a49SYabin Cuizstd -l tmp5* && die "-l must fail on non-zstd file"
1656*01826a49SYabin Cuizstd -lv tmp5.zst | $GREP "Decompressed Size: 0 B (0 B)"  # check that 0 size is present in header
1657*01826a49SYabin Cuizstd -lv tmp5* && die "-l must fail on non-zstd file"
1658*01826a49SYabin Cui
1659*01826a49SYabin Cuiprintln "\n===>  zstd --list/-l test with no content size field "
1660*01826a49SYabin Cuidatagen -g513K | zstd > tmp6.zst
1661*01826a49SYabin Cuizstd -l tmp6.zst
1662*01826a49SYabin Cuizstd -lv tmp6.zst | $GREP "Decompressed Size:"  && die "Field :Decompressed Size: should not be available in this compressed file"
1663*01826a49SYabin Cui
1664*01826a49SYabin Cuiprintln "\n===>   zstd --list/-l test with no checksum "
1665*01826a49SYabin Cuizstd -f --no-check tmp1
1666*01826a49SYabin Cuizstd -l tmp1.zst
1667*01826a49SYabin Cuizstd -lv tmp1.zst
1668*01826a49SYabin Cui
1669*01826a49SYabin Cuiprintln "\n===>  zstd trace tests "
1670*01826a49SYabin Cuizstd -f --trace tmp.trace tmp1
1671*01826a49SYabin Cuizstd -f --trace tmp.trace tmp1 tmp2 tmp3
1672*01826a49SYabin Cuizstd -f --trace tmp.trace tmp1 tmp2 tmp3 -o /dev/null
1673*01826a49SYabin Cuizstd -f --trace tmp.trace tmp1 tmp2 tmp3 --single-thread
1674*01826a49SYabin Cuizstd -f --trace tmp.trace -D tmp1 tmp2 tmp3 -o /dev/null
1675*01826a49SYabin Cuizstd -f --trace tmp.trace -D tmp1 tmp2 tmp3 -o /dev/null --single-thread
1676*01826a49SYabin Cuizstd --trace tmp.trace -t tmp1.zst
1677*01826a49SYabin Cuizstd --trace tmp.trace -t tmp1.zst tmp2.zst
1678*01826a49SYabin Cuizstd -f --trace tmp.trace -d tmp1.zst
1679*01826a49SYabin Cuizstd -f --trace tmp.trace -d tmp1.zst tmp2.zst tmp3.zst
1680*01826a49SYabin Cuizstd -D tmp1 tmp2 -c | zstd --trace tmp.trace -t -D tmp1
1681*01826a49SYabin Cuizstd -b1e10i0 --trace tmp.trace tmp1
1682*01826a49SYabin Cuizstd -b1e10i0 --trace tmp.trace tmp1 tmp2 tmp3
1683*01826a49SYabin Cui
1684*01826a49SYabin Cuirm -f tmp*
1685*01826a49SYabin Cui
1686*01826a49SYabin Cui
1687*01826a49SYabin Cuiprintln "\n===>   zstd long distance matching tests "
1688*01826a49SYabin CuiroundTripTest -g0 " --single-thread --long"
1689*01826a49SYabin CuiroundTripTest -g9M "2 --single-thread --long"
1690*01826a49SYabin Cui# Test parameter parsing
1691*01826a49SYabin CuiroundTripTest -g1M -P50 "1 --single-thread --long=29" " --memory=512MB"
1692*01826a49SYabin CuiroundTripTest -g1M -P50 "1 --single-thread --long=29 --zstd=wlog=28" " --memory=256MB"
1693*01826a49SYabin CuiroundTripTest -g1M -P50 "1 --single-thread --long=29" " --long=28 --memory=512MB"
1694*01826a49SYabin CuiroundTripTest -g1M -P50 "1 --single-thread --long=29" " --zstd=wlog=28 --memory=512MB"
1695*01826a49SYabin Cui
1696*01826a49SYabin Cui
1697*01826a49SYabin Cuiif [ "$ZSTD_LIB_EXCLUDE_COMPRESSORS_DFAST_AND_UP" -ne "1" ]; then
1698*01826a49SYabin Cui    println "\n===>  zstd long distance matching with optimal parser compressed size tests "
1699*01826a49SYabin Cui    optCSize16=$(datagen -g511K | zstd -16 -c | wc -c)
1700*01826a49SYabin Cui    longCSize16=$(datagen -g511K | zstd -16 --long -c | wc -c)
1701*01826a49SYabin Cui    optCSize19=$(datagen -g2M | zstd -19 -c | wc -c)
1702*01826a49SYabin Cui    longCSize19=$(datagen -g2M | zstd -19 --long -c | wc -c)
1703*01826a49SYabin Cui    optCSize19wlog23=$(datagen -g2M | zstd -19 -c  --zstd=wlog=23 | wc -c)
1704*01826a49SYabin Cui    longCSize19wlog23=$(datagen -g2M | zstd -19 -c --long=23 | wc -c)
1705*01826a49SYabin Cui    if [ "$longCSize16" -gt "$optCSize16" ]; then
1706*01826a49SYabin Cui        echo using --long on compression level 16 should not cause compressed size regression
1707*01826a49SYabin Cui        exit 1
1708*01826a49SYabin Cui    elif [ "$longCSize19" -gt "$optCSize19" ]; then
1709*01826a49SYabin Cui        echo using --long on compression level 19 should not cause compressed size regression
1710*01826a49SYabin Cui        exit 1
1711*01826a49SYabin Cui    elif [ "$longCSize19wlog23" -gt "$optCSize19wlog23" ]; then
1712*01826a49SYabin Cui        echo using --long on compression level 19 with wLog=23 should not cause compressed size regression
1713*01826a49SYabin Cui        exit 1
1714*01826a49SYabin Cui    fi
1715*01826a49SYabin Cuifi
1716*01826a49SYabin Cui
1717*01826a49SYabin Cuiprintln "\n===>  zstd asyncio tests "
1718*01826a49SYabin Cui
1719*01826a49SYabin CuiaddFrame() {
1720*01826a49SYabin Cui    datagen -g2M -s$2 >> tmp_uncompressed
1721*01826a49SYabin Cui    datagen -g2M -s$2 | zstd -1 --format=$1 >> tmp_compressed.zst
1722*01826a49SYabin Cui}
1723*01826a49SYabin Cui
1724*01826a49SYabin CuiaddTwoFrames() {
1725*01826a49SYabin Cui  addFrame $1 1
1726*01826a49SYabin Cui  addFrame $1 2
1727*01826a49SYabin Cui}
1728*01826a49SYabin Cui
1729*01826a49SYabin CuitestAsyncIO() {
1730*01826a49SYabin Cui  roundTripTest -g2M "3 --asyncio --format=$1"
1731*01826a49SYabin Cui  roundTripTest -g2M "3 --no-asyncio --format=$1"
1732*01826a49SYabin Cui}
1733*01826a49SYabin Cui
1734*01826a49SYabin Cuirm -f tmp_compressed tmp_uncompressed
1735*01826a49SYabin CuitestAsyncIO zstd
1736*01826a49SYabin CuiaddTwoFrames zstd
1737*01826a49SYabin Cuiif [ $GZIPMODE -eq 1 ]; then
1738*01826a49SYabin Cui  testAsyncIO gzip
1739*01826a49SYabin Cui  addTwoFrames gzip
1740*01826a49SYabin Cuifi
1741*01826a49SYabin Cuiif [ $LZMAMODE -eq 1 ]; then
1742*01826a49SYabin Cui  testAsyncIO lzma
1743*01826a49SYabin Cui  addTwoFrames lzma
1744*01826a49SYabin Cuifi
1745*01826a49SYabin Cuiif [ $LZ4MODE -eq 1 ]; then
1746*01826a49SYabin Cui  testAsyncIO lz4
1747*01826a49SYabin Cui  addTwoFrames lz4
1748*01826a49SYabin Cuifi
1749*01826a49SYabin Cuicat tmp_uncompressed | $MD5SUM > tmp2
1750*01826a49SYabin Cuizstd -d tmp_compressed.zst --asyncio -c | $MD5SUM > tmp1
1751*01826a49SYabin Cui$DIFF -q tmp1 tmp2
1752*01826a49SYabin Cuirm tmp1
1753*01826a49SYabin Cuizstd -d tmp_compressed.zst --no-asyncio -c | $MD5SUM > tmp1
1754*01826a49SYabin Cui$DIFF -q tmp1 tmp2
1755*01826a49SYabin Cui
1756*01826a49SYabin Cuiif [ "$1" != "--test-large-data" ]; then
1757*01826a49SYabin Cui    println "Skipping large data tests"
1758*01826a49SYabin Cui    exit 0
1759*01826a49SYabin Cuifi
1760*01826a49SYabin Cui
1761*01826a49SYabin Cui
1762*01826a49SYabin Cui#############################################################################
1763*01826a49SYabin Cui
1764*01826a49SYabin Cui
1765*01826a49SYabin Cuiif [ -n "$hasMT" ]
1766*01826a49SYabin Cuithen
1767*01826a49SYabin Cui    println "\n===>   adaptive mode "
1768*01826a49SYabin Cui    roundTripTest -g270000000 " --adapt"
1769*01826a49SYabin Cui    roundTripTest -g27000000 " --adapt=min=1,max=4"
1770*01826a49SYabin Cui    roundTripTest -g27000000 " --adapt=min=-2,max=-1"
1771*01826a49SYabin Cui    println "===>   test: --adapt must fail on incoherent bounds "
1772*01826a49SYabin Cui    datagen > tmp
1773*01826a49SYabin Cui    zstd --adapt= tmp && die "invalid compression parameter"
1774*01826a49SYabin Cui    zstd -f -vv --adapt=min=10,max=9 tmp && die "--adapt must fail on incoherent bounds"
1775*01826a49SYabin Cui
1776*01826a49SYabin Cui    println "\n===>   rsyncable mode "
1777*01826a49SYabin Cui    roundTripTest -g10M " --rsyncable"
1778*01826a49SYabin Cui    roundTripTest -g10M " --rsyncable -B100K"
1779*01826a49SYabin Cui    println "===>   test: --rsyncable must fail with --single-thread"
1780*01826a49SYabin Cui    zstd -f -vv --rsyncable --single-thread tmp && die "--rsyncable must fail with --single-thread"
1781*01826a49SYabin Cuifi
1782*01826a49SYabin Cui
1783*01826a49SYabin Cuiprintln "\n===> patch-from=origin tests"
1784*01826a49SYabin Cuidatagen -g1000 -P50 > tmp_dict
1785*01826a49SYabin Cuidatagen -g1000 -P10 > tmp_patch
1786*01826a49SYabin Cuizstd --patch-from=tmp_dict tmp_patch -o tmp_patch_diff
1787*01826a49SYabin Cuizstd -d --patch-from=tmp_dict tmp_patch_diff -o tmp_patch_recon
1788*01826a49SYabin Cui$DIFF -s tmp_patch_recon tmp_patch
1789*01826a49SYabin Cui
1790*01826a49SYabin Cuiprintln "\n===> alternate syntax: patch-from origin"
1791*01826a49SYabin Cuizstd -f --patch-from tmp_dict tmp_patch -o tmp_patch_diff
1792*01826a49SYabin Cuizstd -df --patch-from tmp_dict tmp_patch_diff -o tmp_patch_recon
1793*01826a49SYabin Cui$DIFF -s tmp_patch_recon tmp_patch
1794*01826a49SYabin Cuirm -rf tmp_*
1795*01826a49SYabin Cui
1796*01826a49SYabin Cuiprintln "\n===> patch-from recursive tests"
1797*01826a49SYabin Cuimkdir tmp_dir
1798*01826a49SYabin Cuidatagen > tmp_dir/tmp1
1799*01826a49SYabin Cuidatagen > tmp_dir/tmp2
1800*01826a49SYabin Cuidatagen > tmp_dict
1801*01826a49SYabin Cuizstd --patch-from=tmp_dict -r tmp_dir && die
1802*01826a49SYabin Cuirm -rf tmp*
1803*01826a49SYabin Cui
1804*01826a49SYabin Cuiprintln "\n===> patch-from long mode trigger larger file test"
1805*01826a49SYabin Cuiif [ "$ZSTD_LIB_EXCLUDE_COMPRESSORS_DFAST_AND_UP" -eq "1" ]; then
1806*01826a49SYabin Cui    # if binary tree strategies are excluded, the threshold is different
1807*01826a49SYabin Cui    datagen -g10000000 > tmp_dict
1808*01826a49SYabin Cui    datagen -g10000000 > tmp_patch
1809*01826a49SYabin Cuielse
1810*01826a49SYabin Cui    datagen -g5000000 > tmp_dict
1811*01826a49SYabin Cui    datagen -g5000000 > tmp_patch
1812*01826a49SYabin Cuifi
1813*01826a49SYabin Cuizstd -15 --patch-from=tmp_dict tmp_patch 2>&1 | $GREP "long mode automatically triggered"
1814*01826a49SYabin Cuirm -rf tmp*
1815*01826a49SYabin Cui
1816*01826a49SYabin Cuiprintln "\n===> patch-from very large dictionary and file test"
1817*01826a49SYabin Cuidatagen -g550000000 -P0 > tmp_dict
1818*01826a49SYabin Cuidatagen -g100000000 -P1 > tmp_patch
1819*01826a49SYabin Cuizstd --long=30 -1f --patch-from tmp_dict tmp_patch
1820*01826a49SYabin Cuizstd --long=30 -df --patch-from tmp_dict tmp_patch.zst -o tmp_patch_recon
1821*01826a49SYabin Cui$DIFF -s tmp_patch_recon tmp_patch
1822*01826a49SYabin Cuirm -rf tmp*
1823*01826a49SYabin Cui
1824*01826a49SYabin Cuiprintln "\n===> patch-from --stream-size test"
1825*01826a49SYabin Cuidatagen -g1000 -P50 > tmp_dict
1826*01826a49SYabin Cuidatagen -g1000 -P10 > tmp_patch
1827*01826a49SYabin Cuicat tmp_patch | zstd -f --patch-from=tmp_dict -c -o tmp_patch_diff && die
1828*01826a49SYabin Cuicat tmp_patch | zstd -f --patch-from=tmp_dict --stream-size=1000 -c -o tmp_patch_diff
1829*01826a49SYabin Cuirm -rf tmp*
1830*01826a49SYabin Cui
1831*01826a49SYabin Cuiprintln "\n===>   large files tests "
1832*01826a49SYabin Cui
1833*01826a49SYabin CuiroundTripTest -g270000000 1
1834*01826a49SYabin CuiroundTripTest -g250000000 2
1835*01826a49SYabin CuiroundTripTest -g230000000 3
1836*01826a49SYabin Cui
1837*01826a49SYabin CuiroundTripTest -g140000000 -P60 4
1838*01826a49SYabin CuiroundTripTest -g130000000 -P62 5
1839*01826a49SYabin CuiroundTripTest -g120000000 -P65 6
1840*01826a49SYabin Cui
1841*01826a49SYabin CuiroundTripTest -g70000000 -P70 7
1842*01826a49SYabin CuiroundTripTest -g60000000 -P71 8
1843*01826a49SYabin CuiroundTripTest -g50000000 -P73 9
1844*01826a49SYabin Cui
1845*01826a49SYabin CuiroundTripTest -g35000000 -P75 10
1846*01826a49SYabin CuiroundTripTest -g30000000 -P76 11
1847*01826a49SYabin CuiroundTripTest -g25000000 -P78 12
1848*01826a49SYabin Cui
1849*01826a49SYabin CuiroundTripTest -g18000013 -P80 13
1850*01826a49SYabin CuiroundTripTest -g18000014 -P80 14
1851*01826a49SYabin CuiroundTripTest -g18000015 -P81 15
1852*01826a49SYabin CuiroundTripTest -g18000016 -P84 16
1853*01826a49SYabin CuiroundTripTest -g18000017 -P88 17
1854*01826a49SYabin CuiroundTripTest -g18000018 -P94 18
1855*01826a49SYabin CuiroundTripTest -g18000019 -P96 19
1856*01826a49SYabin Cui
1857*01826a49SYabin CuiroundTripTest -g5000000000 -P99 "1 --zstd=wlog=25"
1858*01826a49SYabin CuiroundTripTest -g3700000000 -P0 "1 --zstd=strategy=6,wlog=25"   # ensure btlazy2 can survive an overflow rescale
1859*01826a49SYabin Cui
1860*01826a49SYabin CuifileRoundTripTest -g4193M -P99 1
1861*01826a49SYabin Cui
1862*01826a49SYabin Cui
1863*01826a49SYabin Cuiprintln "\n===>   zstd long, long distance matching round-trip tests "
1864*01826a49SYabin CuiroundTripTest -g270000000 "1 --single-thread --long"
1865*01826a49SYabin CuiroundTripTest -g130000000 -P60 "5 --single-thread --long"
1866*01826a49SYabin CuiroundTripTest -g35000000 -P70 "8 --single-thread --long"
1867*01826a49SYabin CuiroundTripTest -g18000001 -P80  "18 --single-thread --long"
1868*01826a49SYabin Cui# Test large window logs
1869*01826a49SYabin CuiroundTripTest -g700M -P50 "1 --single-thread --long=29"
1870*01826a49SYabin CuiroundTripTest -g600M -P50 "1 --single-thread --long --zstd=wlog=29,clog=28"
1871*01826a49SYabin Cui
1872*01826a49SYabin Cui
1873*01826a49SYabin Cuiif [ -n "$hasMT" ]
1874*01826a49SYabin Cuithen
1875*01826a49SYabin Cui    println "\n===>   zstdmt long round-trip tests "
1876*01826a49SYabin Cui    roundTripTest -g80000000 -P99 "19 -T2" " "
1877*01826a49SYabin Cui    roundTripTest -g5000000000 -P99 "1 -T2" " "
1878*01826a49SYabin Cui    roundTripTest -g500000000 -P97 "1 -T999" " "
1879*01826a49SYabin Cui    fileRoundTripTest -g4103M -P98 " -T0" " "
1880*01826a49SYabin Cui    roundTripTest -g400000000 -P97 "1 --long=24 -T2" " "
1881*01826a49SYabin Cui    # Exposes the bug in https://github.com/facebook/zstd/pull/1678
1882*01826a49SYabin Cui    # This test fails on 4 different travis builds at the time of writing
1883*01826a49SYabin Cui    # because it needs to allocate 8 GB of memory.
1884*01826a49SYabin Cui    # roundTripTest -g10G -P99 "1 -T1 --long=31 --zstd=clog=27 --fast=1000"
1885*01826a49SYabin Cuielse
1886*01826a49SYabin Cui    println "\n**** no multithreading, skipping zstdmt tests **** "
1887*01826a49SYabin Cuifi
1888*01826a49SYabin Cui
1889*01826a49SYabin Cui
1890*01826a49SYabin Cuiprintln "\n===>  cover dictionary builder : advanced options "
1891*01826a49SYabin Cui
1892*01826a49SYabin CuiTESTFILE="$PRGDIR"/zstdcli.c
1893*01826a49SYabin Cuidatagen > tmpDict
1894*01826a49SYabin Cuiprintln "- Create first dictionary"
1895*01826a49SYabin Cuizstd --train-cover=k=46,d=8,split=80 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict
1896*01826a49SYabin Cuicp "$TESTFILE" tmp
1897*01826a49SYabin Cuizstd -f tmp -D tmpDict
1898*01826a49SYabin Cuizstd -f tmp -D tmpDict --patch-from=tmpDict && die "error: can't use -D and --patch-from=#at the same time"
1899*01826a49SYabin Cuizstd -d tmp.zst -D tmpDict -fo result
1900*01826a49SYabin Cui$DIFF "$TESTFILE" result
1901*01826a49SYabin Cuizstd --train-cover=k=56,d=8 && die "Create dictionary without input file (should error)"
1902*01826a49SYabin Cuiprintln "- Create second (different) dictionary"
1903*01826a49SYabin Cuizstd --train-cover=k=56,d=8 "$TESTDIR"/*.c "$PRGDIR"/*.c "$PRGDIR"/*.h -o tmpDictC
1904*01826a49SYabin Cuizstd -d tmp.zst -D tmpDictC -fo result && die "wrong dictionary not detected!"
1905*01826a49SYabin Cuiprintln "- Create dictionary using shrink-dict flag"
1906*01826a49SYabin Cuizstd --train-cover=steps=256,shrink "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID=1 -o tmpShrinkDict
1907*01826a49SYabin Cuizstd --train-cover=steps=256,shrink=1 "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID=1 -o tmpShrinkDict1
1908*01826a49SYabin Cuizstd --train-cover=steps=256,shrink=5 "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID=1 -o tmpShrinkDict2
1909*01826a49SYabin Cuizstd --train-cover=shrink=5,steps=256 "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID=1 -o tmpShrinkDict3
1910*01826a49SYabin Cuiprintln "- Create dictionary with short dictID"
1911*01826a49SYabin Cuizstd --train-cover=k=46,d=8,split=80 "$TESTDIR"/*.c "$PRGDIR"/*.c --dictID=1 -o tmpDict1
1912*01826a49SYabin Cuicmp tmpDict tmpDict1 && die "dictionaries should have different ID !"
1913*01826a49SYabin Cuiprintln "- Create dictionary with size limit"
1914*01826a49SYabin Cuizstd --train-cover=steps=8 "$TESTDIR"/*.c "$PRGDIR"/*.c -o tmpDict2 --maxdict=4K
1915*01826a49SYabin Cuiprintln "- Compare size of dictionary from 90% training samples with 80% training samples"
1916*01826a49SYabin Cuizstd --train-cover=split=90 -r "$TESTDIR"/*.c "$PRGDIR"/*.c
1917*01826a49SYabin Cuizstd --train-cover=split=80 -r "$TESTDIR"/*.c "$PRGDIR"/*.c
1918*01826a49SYabin Cuiprintln "- Create dictionary using all samples for both training and testing"
1919*01826a49SYabin Cuizstd --train-cover=split=100 -r "$TESTDIR"/*.c "$PRGDIR"/*.c
1920*01826a49SYabin Cuiprintln "- Test -o before --train-cover"
1921*01826a49SYabin Cuirm -f tmpDict dictionary
1922*01826a49SYabin Cuizstd -o tmpDict --train-cover "$TESTDIR"/*.c "$PRGDIR"/*.c
1923*01826a49SYabin Cuitest -f tmpDict
1924*01826a49SYabin Cuizstd --train-cover "$TESTDIR"/*.c "$PRGDIR"/*.c
1925*01826a49SYabin Cuitest -f dictionary
1926*01826a49SYabin Cuirm -f tmp* dictionary
1927*01826a49SYabin Cui
1928*01826a49SYabin Cuirm -f tmp*
1929