Blame test/functions.source

Packit 01d647
#!/bin/bash
Packit 01d647
Packit Service fb147c
# Library of bash functions use by test/*.sh
Packit Service fb147c
# The scripts begin "source functions.source"
Packit Service fb147c
# Don't detab this file! removeTest() addModTest() need them!
Packit Service fb147c
Packit 01d647
##
Packit 01d647
# run a test
Packit 01d647
runTest()
Packit 01d647
{
Packit 01d647
    local prog=$1
Packit 01d647
    shift
Packit 01d647
    (
Packit Service fb147c
        mkdir -p $here/tmp
Packit Service fb147c
        cd       $here/tmp
Packit Service fb147c
        if [ ! -z $EXIV2_ECHO ]; then
Packit Service fb147c
            echoTest $VALGRIND $bin$prog$exe "$@"
Packit Service fb147c
        fi
Packit Service fb147c
        $VALGRIND $bin$prog$exe "$@"
Packit 01d647
    )
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit 01d647
# echo commands and arguments
Packit 01d647
echoTest()
Packit 01d647
{
Packit Service fb147c
    local count=1
Packit Service fb147c
    for i in $@ ; do
Packit Service fb147c
        echo $((count++)):  $i
Packit Service fb147c
    done
Packit Service fb147c
    echo -----------------------
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit 01d647
# predictate
Packit 01d647
existsTest()
Packit 01d647
{
Packit Service fb147c
    local prog=$1
Packit Service fb147c
    result=0
Packit Service fb147c
    if [ -z "$bin" ]; then
Packit Service fb147c
        if [ ! -z $(which $prog) ]; then
Packit Service fb147c
            result=1
Packit Service fb147c
        fi
Packit Service fb147c
    else
Packit Service fb147c
        if [ -e $bin$prog -o -e $bin$prog$exe ]; then
Packit Service fb147c
            result=1
Packit Service fb147c
        fi
Packit Service fb147c
    fi
Packit Service fb147c
    echo $result
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit Service fb147c
# copy file (used by conversions.sh)
Packit 01d647
copy()
Packit 01d647
{
Packit Service fb147c
    \cp "$1" "$2"
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit 01d647
# copy file from data to tmp (copyTestFile from to)
Packit 01d647
copyTestFile()
Packit 01d647
{
Packit Service fb147c
    if [ $# == 2 ]; then
Packit Service fb147c
        cp -f "$here/data/$1" "$here/tmp/$2"
Packit Service fb147c
    elif [ $# == 1 ]; then
Packit Service fb147c
        stub=$(basename $1)
Packit Service fb147c
        cp -f "$here/data/$1" "$here/tmp/$stub"
Packit Service fb147c
    else
Packit Service fb147c
        echo "*** error copyTestFile: illegal number of inputs = $# ***"
Packit Service fb147c
    fi
Packit 01d647
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit 01d647
# copy 1 or more files from data to tmp
Packit 01d647
copyTestFiles()
Packit 01d647
{
Packit Service fb147c
    for i in "$@" ; do
Packit Service fb147c
        copyTestFile "$i" "$i"
Packit Service fb147c
    done
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit 01d647
# result analysis
Packit 01d647
reportTest()
Packit 01d647
{
Packit 01d647
    cat $results | tr '\\' '/' > ${results}-new
Packit Service fb147c
    mv -f ${results}-new $results
Packit 01d647
Packit 01d647
    if [ $# -eq 0 ]; then
Packit 01d647
        lhs=$results
Packit 01d647
        rhs=$good
Packit 01d647
    else
Packit 01d647
        if [ $# -eq 3 ] ; then
Packit 01d647
            diffargs=$1
Packit 01d647
            lhs=$2
Packit 01d647
            rhs=$3
Packit 01d647
        else
Packit 01d647
            lhs=$1
Packit 01d647
            rhs=$2
Packit 01d647
        fi
Packit 01d647
    fi
Packit 01d647
Packit Service fb147c
    diff $diffargs $lhs $rhs
Packit 01d647
    rc=$?
Packit 01d647
    if [ $rc -eq 0 ] ; then
Packit 01d647
        echo "all testcases passed."
Packit 01d647
    fi
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit 01d647
# moved here from write-test.sh
Packit 01d647
# Function:
Packit 01d647
#     runTestCase number file
Packit 01d647
# Params:
Packit 01d647
#     number: Test case number
Packit 01d647
#     file  : Input file
Packit 01d647
# Abstract:
Packit 01d647
# Run the requested test case number with the given file
Packit 01d647
runTestCase()
Packit 01d647
{
Packit 01d647
    rtc_number=$1
Packit 01d647
    rtc_infile=$2
Packit 01d647
Packit 01d647
    rtc_outfile=test${rtc_number}.jpg
Packit 01d647
    rtc_jpgthumb=thumb${rtc_number}.jpg
Packit 01d647
    rtc_tifthumb=thumb${rtc_number}.tif
Packit 01d647
Packit 01d647
    rm -f $rtc_outfile $rtc_jpgthumb $rtc_tifthumb
Packit 01d647
    rm -f iii ttt;
Packit 01d647
Packit 01d647
    echo "------------------------------------------------------------"
Packit 01d647
    runTest exifprint $rtc_infile > iii;
Packit 01d647
    cp $rtc_infile $rtc_outfile;
Packit 01d647
    runTest write-test $rtc_infile $rtc_number > ttt;
Packit Service fb147c
    diff $diffargs iii ttt
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit 01d647
# moved here from imagetest.sh
Packit 01d647
eraseTest()
Packit 01d647
{
Packit 01d647
    src=$1
Packit 01d647
    test=${src}.etst
Packit 01d647
    good=$datapath/${src}.egd
Packit 01d647
Packit 01d647
    #setup
Packit 01d647
    cp $datapath/$src $test
Packit 01d647
Packit 01d647
    #run tests
Packit 01d647
    ${bin}metacopy $test $test
Packit 01d647
Packit 01d647
    #check results
Packit 01d647
    diffCheck $test $good
Packit 01d647
    printf "."
Packit 01d647
}
Packit 01d647
Packit 01d647
copyTest()
Packit 01d647
{
Packit Service fb147c
    num=$1    # case number
Packit Service fb147c
    src=$2    # input file
Packit Service fb147c
    dst=$3    # copy to hear
Packit 01d647
    test=${dst}.c${num}tst
Packit 01d647
    good=$datapath/${dst}.c${num}gd
Packit 01d647
Packit 01d647
    #setup
Packit 01d647
    cp $datapath/$dst $test
Packit 01d647
Packit 01d647
    #run tests
Packit 01d647
    ${bin}metacopy -a $datapath/$src $test
Packit 01d647
Packit 01d647
    #check results
Packit 01d647
    diffCheck $test $good
Packit 01d647
    printf "."
Packit 01d647
}
Packit 01d647
Packit 01d647
iptcTest()
Packit 01d647
{
Packit Service fb147c
    num=$1    # case number
Packit Service fb147c
    src=$2    # input file
Packit Service fb147c
    dst=$3    # copy to hear
Packit 01d647
    test=${dst}.i${num}tst
Packit 01d647
    good=$datapath/${dst}.i${num}gd
Packit 01d647
Packit 01d647
    #setup
Packit 01d647
    cp $datapath/$dst $test
Packit 01d647
Packit 01d647
    #run tests
Packit 01d647
    runTest metacopy -ip $datapath/$src $test
Packit 01d647
Packit 01d647
    #check results
Packit 01d647
    diffCheck $test $good
Packit 01d647
    printf "."
Packit 01d647
}
Packit 01d647
Packit Service fb147c
##
Packit 01d647
# Make sure to pass the test file first and the known good file second
Packit 01d647
diffCheck()
Packit 01d647
{
Packit 01d647
    test=$(real_path $1)
Packit 01d647
    good=$(real_path $2)
Packit 01d647
    if [ -z "$errors" ]; then let -a errors=0; fi
Packit 01d647
Packit 01d647
    #run diff and check results
Packit Service fb147c
    if [ $PLATFORM == SunOS ]; then
Packit Service fb147c
        bdiff $diffargs "$test" "$good"
Packit Service fb147c
    elif [ $PLATFORM == FreeBSD -o $PLATFORM == NetBSD ]; then
Packit Service fb147c
        diff $diffargs "$test" "$good"
Packit Service fb147c
    else
Packit Service fb147c
        diff --binary $diffargs "$test" "$good"
Packit Service fb147c
    fi
Packit 01d647
    if [ $? -ne 0 ]; then
Packit 01d647
       errors=$(expr $errors + 1)
Packit 01d647
    else
Packit 01d647
       rm $test
Packit 01d647
    fi
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit 01d647
# moved here from iotest.sh
Packit 01d647
ioTest()
Packit 01d647
{
Packit 01d647
    src=$datapath/$1
Packit 01d647
    out1=${1}.1
Packit 01d647
    out2=${1}.2
Packit 01d647
Packit 01d647
    #run tests
Packit 01d647
    runTest iotest $src $out1 $out2
Packit 01d647
    if [ $? -ne 0 ]; then
Packit 01d647
       errors=`expr $errors + 1`
Packit 01d647
       return
Packit 01d647
    fi
Packit 01d647
Packit 01d647
    #check results
Packit 01d647
    diffCheck $out1 $src
Packit 01d647
    diffCheck $out2 $src
Packit 01d647
    printf "."
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit 01d647
# moved here from iptctest.sh
Packit 01d647
printTest()
Packit 01d647
{
Packit 01d647
    src=$1
Packit 01d647
    test=${src}.iptst
Packit 01d647
    good=$datapath/${src}.ipgd
Packit 01d647
Packit 01d647
    #run tests
Packit 01d647
    runTest iptcprint $datapath/$src > $test
Packit 01d647
Packit 01d647
    #check results
Packit 01d647
    diffCheck $test $good
Packit 01d647
    printf "."
Packit 01d647
}
Packit 01d647
Packit 01d647
removeTest()
Packit 01d647
{
Packit 01d647
    src=$1
Packit 01d647
    tmp="temp"
Packit 01d647
    test=${src}.irtst
Packit 01d647
    good=$datapath/${src}.irgd
Packit 01d647
Packit 01d647
    #setup
Packit 01d647
    cp $datapath/$src $tmp
Packit 01d647
Packit 01d647
    #run tests
Packit 01d647
    runTest iptctest $tmp <<-eoc
Packit 01d647
		r Iptc.Application2.Byline
Packit 01d647
		r Iptc.Application2.Caption
Packit 01d647
		r Iptc.Application2.Keywords
Packit 01d647
		r Iptc.Application2.Keywords
Packit 01d647
		r Iptc.Application2.Keywords
Packit 01d647
		r Iptc.Application2.CountryName
Packit 01d647
eoc
Packit 01d647
    runTest iptcprint $tmp > $test
Packit 01d647
Packit 01d647
    #check results
Packit 01d647
    diffCheck $test $good
Packit 01d647
    printf "."
Packit 01d647
    rm $tmp
Packit 01d647
}
Packit 01d647
Packit 01d647
addModTest()
Packit 01d647
{
Packit 01d647
    src=$1
Packit 01d647
    tmp="temp"
Packit 01d647
    test=${src}.iatst
Packit 01d647
    good=$datapath/${src}.iagd
Packit 01d647
Packit 01d647
    #setup
Packit 01d647
    cp $datapath/$src $tmp
Packit 01d647
Packit 01d647
    #run tests
Packit 01d647
    runTest iptctest $tmp <<-eoc
Packit Service fb147c
		a Iptc.Application2.Headline		  The headline I am
Packit Service fb147c
		a Iptc.Application2.Keywords		  Yet another keyword
Packit Service fb147c
		m Iptc.Application2.DateCreated		  2004-8-3
Packit Service fb147c
		a Iptc.Application2.Urgency			  3
Packit Service fb147c
		m Iptc.Application2.SuppCategory	  "bla bla ba"
Packit Service fb147c
		a Iptc.Envelope.ModelVersion		  2
Packit Service fb147c
		a Iptc.Envelope.TimeSent			  14:41:0-05:00
Packit 01d647
		a Iptc.Application2.RasterizedCaption 230 42 34 2 90 84 23 146
Packit 01d647
eoc
Packit 01d647
    runTest iptcprint $tmp > $test
Packit 01d647
Packit 01d647
    #check results
Packit 01d647
    diffCheck $test $good
Packit 01d647
    printf "."
Packit 01d647
    rm $tmp
Packit 01d647
}
Packit 01d647
Packit 01d647
extendedTest()
Packit 01d647
{
Packit 01d647
    src=$1
Packit 01d647
    tmp="temp"
Packit 01d647
    test=${src}.ixtst
Packit 01d647
    good=$datapath/${src}.ixgd
Packit 01d647
Packit 01d647
    #setup
Packit 01d647
    cp $datapath/$src $tmp
Packit 01d647
Packit 01d647
    #run tests
Packit 01d647
    runTest iptctest $tmp < $datapath/ext.dat
Packit 01d647
    runTest iptcprint $tmp > $test
Packit 01d647
Packit 01d647
    #check results
Packit 01d647
    diffCheck $test $good
Packit 01d647
    printf "."
Packit 01d647
    rm $tmp
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit 01d647
#
Packit 01d647
hardLinkFiles()
Packit 01d647
{
Packit Service fb147c
    target="$1"
Packit Service fb147c
    shift
Packit Service fb147c
    for var; do
Packit Service fb147c
        if [ -e $var ]; then rm -rf $var ; fi
Packit Service fb147c
        ln $target $var
Packit Service fb147c
    done
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit 01d647
# real_path - report the absolute path to a file
Packit 01d647
real_path ()
Packit 01d647
{
Packit Service fb147c
    if [ "$PLATFORM" == "Darwin" -o "$PLATFORM" == "mingw" ]; then
Packit Service fb147c
        if [ -d "$1" ]; then
Packit Service fb147c
            cd "$1"
Packit Service fb147c
            echo $PWD
Packit Service fb147c
        else
Packit Service fb147c
            cd $(dirname $1)
Packit Service fb147c
            echo "$PWD"/$(basename "$1")
Packit Service fb147c
        fi
Packit Service fb147c
    else
Packit Service fb147c
        which realpath 2>/dev/null >/dev/null
Packit Service fb147c
        if [ $? == 0 ]; then
Packit Service fb147c
            realpath "$1"
Packit Service fb147c
        else
Packit Service fb147c
            readlink -f "$1"
Packit Service fb147c
        fi
Packit 01d647
    fi
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit 01d647
# print checksum for one file
Packit 01d647
checkSum()
Packit 01d647
{
Packit Service fb147c
    if [ "$PLATFORM" == 'NetBSD' -o "$PLATFORM" == 'FreeBSD' -o "$PLATFORM" == 'Darwin' ]; then
Packit Service fb147c
        md5 -q $1
Packit 01d647
    else
Packit Service fb147c
        md5sum $1 | cut -d' ' -f 1
Packit 01d647
    fi
Packit 01d647
}
Packit 01d647
Packit 01d647
##
Packit Service fb147c
# startHttpServer - power up the python web server
Packit Service fb147c
startHttpServer() {
Packit Service fb147c
    cd "${testdir}/.."                   # testdir is the tmp output directory
Packit Service fb147c
    
Packit Service fb147c
    if    [ "$platform" == "cygwin" ]; then dport=12762
Packit Service fb147c
    elif  [ "$platform" == "mingw"  ]; then dport=12761
Packit Service fb147c
    else                                    dport=12760
Packit Service fb147c
    fi
Packit Service fb147c
Packit Service fb147c
    if [ ! -z $EXIV2_PORT ]; then port=$EXIV2_PORT ; else port=$dport          ; fi
Packit Service fb147c
    if [ ! -z $EXIV2_HTTP ]; then http=$EXIV2_HTTP ; else http=http://localhost; fi
Packit Service fb147c
    exiv2_url=$http:$port
Packit Service fb147c
    python3 -m http.server $port &       # start a background local HTTP server in the "real" test directory
Packit Service fb147c
    sleep 2                              # wait for it to init or die!
Packit Service fb147c
    exiv2_httpServer=$!
Packit Service fb147c
    # ask the server to reply
Packit Service fb147c
    echo $exiv2_url status = $(python3 -c "import urllib.request;print(urllib.request.urlopen('$exiv2_url/').status)")
Packit Service fb147c
}
Packit Service fb147c
Packit Service fb147c
##
Packit Service fb147c
# closeHttpServer - power down the python web server
Packit Service fb147c
closeHttpServer() {
Packit Service fb147c
    if [ ! -z $exiv2_httpServer ]; then
Packit Service fb147c
        echo kill  exiv2_httpServer $exiv2_httpServer
Packit Service fb147c
             kill $exiv2_httpServer      # kill the server
Packit Service fb147c
    fi 
Packit Service fb147c
}
Packit Service fb147c
Packit Service fb147c
##
Packit Service fb147c
# prepare tmp directory and variables
Packit 01d647
prepareTest()
Packit 01d647
{
Packit Service fb147c
    ##
Packit Service fb147c
    # locale and timezone setting
Packit Service fb147c
    export LC_ALL=C
Packit Service fb147c
    export TZ=BST-1
Packit Service fb147c
Packit Service fb147c
    os=$(uname)
Packit Service fb147c
    export PLATFORM=$os
Packit Service fb147c
    if [ $os != FreeBSD -a $os != NetBSD -a $os != SunOS -a $os != Darwin -a $os != Linux ]; then
Packit Service fb147c
        os=$(uname -o)
Packit Service fb147c
        if [ $os == Cygwin ]; then
Packit Service fb147c
            PLATFORM=cygwin
Packit Service fb147c
        elif [ os == Msys ]; then
Packit Service fb147c
            PLATFORM=mingw
Packit Service fb147c
        fi
Packit Service fb147c
    fi
Packit Service fb147c
Packit Service fb147c
    if [ "$PLATFORM" == cygwin -o "$PLATFORM" == mingw ]; then
Packit Service fb147c
        exe=.exe
Packit Service fb147c
    fi
Packit Service fb147c
    
Packit Service fb147c
    if [ ! -z $EXIV2_EXT ]; then
Packit Service fb147c
        exe=$EXIV2_EXT
Packit Service fb147c
    fi
Packit Service fb147c
Packit Service fb147c
    ##
Packit Service fb147c
    # initialize globals
Packit Service fb147c
    this=$(basename $0 .sh)
Packit Service fb147c
    here=$PWD
Packit Service fb147c
    datapath="../data"
Packit Service fb147c
    testdir="$here/tmp"
Packit Service fb147c
    datadir="../data"
Packit Service fb147c
Packit Service fb147c
    if [ -z "$EXIV2_BINDIR" ] ; then
Packit 01d647
        bin="$here/../build/bin/"
Packit Service fb147c
    else
Packit Service fb147c
        bin="$EXIV2_BINDIR/"
Packit Service fb147c
    fi
Packit Service fb147c
    
Packit Service fb147c
    # update PATHs to ensure we load the the correct dynamlic library
Packit Service fb147c
    if [ $PLATFORM == 'mingw' -a $PLATFORM == 'cygwin' ]; then
Packit Service fb147c
        export PATH="$bin:$PATH"
Packit Service fb147c
    elif [ 'PLATFORM' == 'Darwin' ]; then
Packit Service fb147c
        export DYLD_LIBRARY_PATH="$bin/../lib:$DYLD_LIBRARY_PATH"
Packit Service fb147c
    else
Packit Service fb147c
        export LD_LIBRARY_PATH="$bin/../lib:$LD_LIBRARY_PATH"
Packit Service fb147c
    fi
Packit 01d647
Packit 01d647
    ##
Packit 01d647
    # figure out arguments for diff
Packit 01d647
    good="$here/data/${this}.out"
Packit 01d647
    results="$here/tmp/${this}.out"
Packit Service fb147c
    mkdir -p $here/tmp
Packit 01d647
    tmpfile=$here/tmp/$this
Packit Service fb147c
    echo '' >> $tmpfile
Packit 01d647
Packit Service fb147c
    if [ "$PLATFORM" == SunOS -o "$PLATFORM" == FreeBSD -o "$PLATFORM" == NetBSD ] ; then
Packit Service fb147c
        da1=""
Packit Service fb147c
        da2=""
Packit Service fb147c
    else
Packit Service fb147c
        diffargs="--strip-trailing-cr"
Packit Service fb147c
        diff -q $diffargs $tmpfile $tmpfile 2>/dev/null
Packit Service fb147c
        if [ $? -ne 0 ]; then
Packit Service fb147c
            diffargs=""
Packit Service fb147c
        fi
Packit Service fb147c
Packit Service fb147c
        tmpfile=tmp/ttt
Packit Service fb147c
        echo '' >> $tmpfile
Packit Service fb147c
        da1="--strip-trailing-cr"
Packit Service fb147c
        diff -q $da1 $tmpfile $tmpfile 2>/dev/null
Packit Service fb147c
        if [ $? -ne 0 ] ; then
Packit Service fb147c
            da1=""
Packit Service fb147c
        fi
Packit Service fb147c
        da2="--ignore-matching-lines=^Usage:.*exiv2"
Packit Service fb147c
        diff -q $da2 $tmpfile $tmpfile 2>/dev/null
Packit Service fb147c
    fi
Packit Service fb147c
    diffargs="$da1 $da2"
Packit 01d647
Packit 01d647
    ##
Packit 01d647
    # test that exiv2 and some sample apps are in the bin!
Packit 01d647
    for e in exiv2 exifprint easyaccess-test metacopy ; do
Packit Service fb147c
        e="${bin}${e}${exe}"
Packit Service fb147c
        if [ ! -e "$e" ]; then
Packit Service fb147c
            echo '******************************************'
Packit Service fb147c
            echo '***' $(real_path "$e") does not exist
Packit Service fb147c
            echo '******************************************'
Packit Service fb147c
            exit 42
Packit Service fb147c
        fi
Packit 01d647
    done
Packit Service fb147c
Packit Service fb147c
    # set platform for msvc builds
Packit Service fb147c
    platform=$PLATFORM
Packit Service fb147c
    if [ $PLATFORM == mingw -o $PLATFORM == cygwin ]; then
Packit Service fb147c
        platform=$(runTest exiv2 -vV 2>/dev/null | grep platform=)
Packit Service fb147c
        if [ "$platform" == "platform=windows" ]; then
Packit Service fb147c
            platform="windows"
Packit Service fb147c
        fi
Packit Service fb147c
    fi
Packit 01d647
}
Packit 01d647
Packit 01d647
prepareTest
Packit 01d647
Packit 01d647
# That's all Folks!
Packit 01d647
##