#!/bin/sh

tearDown() {
    POLDEK_TESTING_DENIED_FILES=""
    [ -n "$REPO" ] && rm -rf $REPO/packages.*
    [ -n "$TMPDIR" ] && rm -rf $TMPDIR/*.*
}

setUp() {
    tearDown
}

oneTimeSetUp() {
    [ ! -d "$PWD/sh/lib" ] && fail "$PWD is not a tests directory (missing sh/lib)"

    SHLIBDIR="$PWD/sh/lib"
    
    SOURCE_REPO=${SOURCE_REPO:-"${PWD}/repo"}
    [ ! -d "$SOURCE_REPO" ] && fail "$SOURCE_REPO: no such directory"

    TMP=${TMP:-""}
    TMPDIR=${TMPDIR:-""}
    [ -z "$TMP" ] && TMP="${TMPDIR}"
    [ -z "$TMP" ] && TMP="/tmp"
    TMP="${TMP}/poldekTests.$$"
    TMPDIR="$TMP"

    rm -rf $TMPDIR
    mkdir -p $TMPDIR
    [ ! -d $TMPDIR ] && fail "$TMPDIR: no such directory"

    
    CACHEDIR="$TMPDIR/kesz"
    rm -rf $CACHEDIR
    mkdir -p $CACHEDIR
    [ ! -d $CACHEDIR ] && fail "$CACHEDIR: no such directory"

    REPO="$TMPDIR/repo"
    REPOURL="test://$TMPDIR/repo/"

    mkdir -p $REPO
    [ ! -d $REPO ] && fail "mkdir $REPO failed?"

    PATH="$PATH:$PWD/sh/lib/"

    POLDEK="$PWD/../cli/poldek $QUIET"
    POLDEK_NOCONF="$POLDEK --noconf -Ovfile_retries=1 --cachedir $CACHEDIR"
    POLDEK_UP="$POLDEK --conf ./sh/lib/vftest-fetch.conf --cachedir $CACHEDIR"
    ln -sf $SOURCE_REPO/*.rpm $REPO/ || fail
    tearDown
}

poldek_up() {
    $POLDEK_UP -Osource="test,type=pndir $REPOURL" $@
}

oneTimeTearDown() {
   if echo $TMPDIR | grep -q poldekTest; then rm -rf $TMPDIR; fi
   tmpdir=$(dirname $TMPDIR)
   TMP="$tmpdir"
   TMPDIR="$tmpdir"
}

die_if_empty_index() {
    die_if_invalid_index $1 ""
}    

die_if_invalid_index() {
    anindex=$1
    expected_packages=$2

    [ -f $anindex ] || fail "$anindex not created"
    if echo $anindex | grep -q "diff.toc"; then
       expected_lines="$expected_packages"

       lines=$(zcat $anindex | wc -l)
       if [ "$lines" != "$expected_lines" ]; then
          fail "$anindex contains $lines lines, expected $expected_lines"
       fi
       return
    fi

    anindex_type="pdir"
    if echo $anindex | grep -q \.ndir\.; then anindex_type="pndir"; fi

    anindex_real_type="pdir"
    if zgrep -q '^tndb[0-9]\.[0-9]' $anindex; then
       anindex_real_type="pndir"
    fi
    
    if [ "$anindex_real_type" != "$anindex_type" ]; then
        fail "invalid $anindex type $anindex_type, real is $anindex_real_type"
    fi

    if zgrep -q 'Contains 0 packages' $anindex; then
        if [ "$expected_packages" != "0" ]; then
            fail "empty $anindex"
        fi
    fi

    if [ -n "$expected_packages" ]; then 
       if ! zgrep -q "Contains $expected_packages packages" $anindex; then
            fail "$anindex: number of packages mismatch"
       fi
    fi
}


add_package_to_repo() {
    for p in $(ls $SOURCE_REPO/*.rpm); do 
        [ ! -f $p ] && fail "no packages in $SOURCE_REPO?"
        package=$(basename $p)

        if [ ! -f "$REPO/$package" ]; then
            ln -sf $p $REPO/$package
            msg "Added $package"
            return 0
        fi
    done
}


remove_package_from_repo() {
    package=$(find $REPO -name \*.rpm | head -1)
    rm -f $package
    msg "Removed $(basename $package)"
}


random_change_repo() {
    to_add=$(perl -e '@s=(a..z, A..Z, 0..9); print $s[rand(@s)]')
    to_del=$(perl -e '@s=(a..z, A..Z, 0..9); print $s[rand(@s)]')

    while [ "$to_add" == "$to_del" ]; do
       to_del=$(perl -e '@s=(a..z, A..Z, 0..9); print $s[rand(@s)]')
    done

    #echo "- adding $to_add\*, removing $to_del\*";

    nadded=0
    nremoved=0

    for i in $SOURCE_REPO/${to_add}*.rpm; do
        bn=$(basename $i);
          
        [ ! -f $i ] && continue;
        [ -f $REPO/$bn ] && continue;

        nadded=$(expr $nadded + 1)
        msg "    - add $bn"
        ln -sf $i $REPO/$bn
    done

    for i in $REPO/${to_del}*.rpm; do
        bn=$(basename $i);
          
        [ ! -f $i ] && continue
        msg "   - rm $bn"
        rm -f $i
        nremoved=$(expr $nremoved + 1)
    done 
	

    nchanges=$(expr $nadded + $nremoved)
    [ "$nchanges" = "0" ] && random_change_repo

    #msg "Added $nadded and $nremoved removed"
}
