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