#!/bin/sh
# $Id$

. ./sh/lib/setup
. ./sh/lib/repo-setup
. ./sh/lib/compr-setup

mkidx() {
   $POLDEK_NOCONF -s $REPO --mkidx --mt pndir || fail "mkidx failed"
}

ls_expect() {
    local expected=$1
    is_verbose_mode && $POLDEK_RAW_UP -q -Oautoupa=n -Osource="test,type=pndir $REPOURL" -n test --cmd ls
    n=$($POLDEK_RAW_UP -q -Oautoupa=n -Osource="test,type=pndir $REPOURL" -n test --cmd ls | grep -P '^\w+-\d+-\d+\.\w+$' | wc -l)

    assertEquals "ls: invalid number of packages found (expected $expected, got $n)" "$n" "$expected"
    [ "$n" == "$expected" ]
}

up() {
    $POLDEK_UP -Oautoupa=n -Osource="test,type=pndir $REPOURL" --up || fail "up failed"
    if [ $# -eq 1 ]; then
        local expected_packages_after=$1
        [ -n "$expected_packages_after" ] && ls_expect $expected_packages_after
    fi
}

up_debug() {
    echo $POLDEK_UP -Oautoupa=n -Osource="test,type=pndir $REPOURL" --up || fail "up failed"
}

testUpdate()
{
    POLDEK_TESTING_DENIED_FILES="packages.ndir.diff.toc"

    rm -rf $REPO/*.*
    # Create repo and generate some diffs
    msg "\n## Creating empty index"
    indexfile="$REPO/packages.ndir$COMPR_EXT"
    $POLDEK_NOCONF --st dir -s $REPO --mkidx --mt pndir || fail "mkidx failed"
    die_if_invalid_index $indexfile 0

    msg "\n## up #0"
    up

    POLDEK_TESTING_DENIED_FILES="packages.ndir$COMPR_EXT"
    msg "\n## Changing repo #1"
    sleep 1
    add_package_to_repo
    mkidx
    die_if_invalid_index $indexfile 1
    die_if_invalid_index "$REPO/packages.i/packages.ndir.diff.toc$COMPR_EXT" 1
    msg "\n## up #1"
    up 1

    msg "\n## Changing repo #2"
    sleep 1
    remove_package_from_repo
    mkidx
    die_if_invalid_index $indexfile 0
    die_if_invalid_index "$REPO/packages.i/packages.ndir.diff.toc$COMPR_EXT" 2

    msg "\n## up #2"
    up 0

    msg "\n## Changing repo #3"
    sleep 1
    add_package_to_repo
    add_package_to_repo
    mkidx
    die_if_invalid_index $indexfile 2
    die_if_invalid_index "$REPO/packages.i/packages.ndir.diff.toc$COMPR_EXT" 3

    msg "\n## up #3"
    up 2

    # <https://bugs.pld-linux.org/show_bug.cgi?id=28>
    msg "\n## Resetting repo"
    sleep 1
    rm -rf $REPO/packages.*
    add_package_to_repo
    mkidx
    msg "\n## up (reset)"

    POLDEK_TESTING_DENIED_FILES="packages.ndir.diff.toc"
    #$POLDEK_UP -Oautoupa=n -Osource="test,type=pndir $REPOURL" --up >/dev/null
    #[ $? -eq 0 ] && fail "up ok" # should fail

    $POLDEK_UP -Oautoupa=y -Osource="test,type=pndir $REPOURL" --up || fail "up(a) failed"
    POLDEK_TESTING_DENIED_FILES=""

    # upa
    msg "\n## Changing repo #4"
    sleep 1
    add_package_to_repo
    mkidx
    msg "\n## up #4"

    POLDEK_TESTING_DENIED_FILES="packages.ndir$COMPR_EXT"
    $POLDEK_UP -Oautoupa=n -Osource="test,type=pndir $REPOURL" --up || fail "up failed"

    POLDEK_TESTING_DENIED_FILES="$COMPR_EXT" # should be up to date
    $POLDEK_UP -Oautoupa=n -Osource="test,type=pndir $REPOURL" --up || fail "up failed"
    $POLDEK_UP -Oautoupa=n -Osource="test,type=pndir $REPOURL" --upa || fail "up failed"
    ls_expect 4

    # autoupa on missing diff
    msg "\n## Changing repo #5 (missing diff file and autoupa)"
    sleep 1
    add_package_to_repo
    mkidx
    msg "\n## up #5"

    POLDEK_TESTING_DENIED_FILES=""
    lastdiff=$(ls -tr $REPO/packages.i/packages.ndir.*.*.*-*.*.*$COMPR_EXT | tail -1)
    [ -z "$lastdiff" ] && fail "no last diff?"
    msg "lastdiff $lastdiff"
    rm -f "$lastdiff"
    $POLDEK_UP -Oautoupa=y -Osource="test,type=pndir $REPOURL" --up
    if [ $? -eq 0 ]; then
        force_msg "THE ERROR ABOVE (about missig packages.i/ file) is EXPECTED"
    else
        fail "up"
    fi
    ls_expect 5

    msg "\n## stubindex"
    index=$(find $CACHEDIR -name packages.ndir$COMPR_EXT)
    REPO_CACHE_DIR=$(dirname $index)
    stubindex="$REPO_CACHE_DIR/stubindex.pndir.zst"
    if [ ! -f "$stubindex" ]; then
        fail "no stubindex $stubindex!"
    else
        assertEquals $(zstdcat "$stubindex" | wc -l) "5"
        rm -f $stubindex
        if ls_expect 5; then
            assertEquals $(zstdcat "$stubindex" | wc -l) "5" # recreated at load
        fi

    fi

}

. ./sh/lib/shunit2
