#!/bin/sh
set -e

#run with
#autopkgtest ../runit-init_2.2.0-7_amd64.deb ../runit_2.2.0-7_amd64.deb ../getty-run_2.2.0-7_all.deb  . --test-name=cpsv-test -- qemu ../autopkgtest.img

rc=0

rcadd() { printf '%s\n' "$*"; rc=$((rc+1)); }
fail() { rcadd "FAIL: $*"; }
warn() { printf '%s\n' "WARN: $*"; }

## test setup
# install services as if they were shipped in a package with dh-runit
#svlist="installed-sv multi-sv@default linklog-sv installedfull-sv uninstalled-sv norun-sv binempty-sv binnopath-sv nobin-sv"

goodsvs="installed-sv installedfull-sv linklog-sv multi-sv@default uninstalled-sv"
badsvs="norun-sv binempty-sv binnopath-sv nobin-sv"
usersvlist="user-sv@user linklog-usersv@user full-usersv@user"
dousertest=0
homesv=/home/cpsvtestuser/.runit/sv
svlist="$goodsvs $badsvs"
# NOTE services without bin, with name that match a systemd or sysv service are not tested
# TODO supervise symlinks not tested

# test setup
echo "preparing test setup.."
for dir in debian/tests/sv/* debian/tests/badsv/*  ; do
    #echo "importing $dir testservice"
    cp -r $dir /usr/share/runit/sv/
done

#setup for p
cp -a "/usr/share/runit/sv/installedfull-sv" "/usr/share/runit/sv/installedfull-sv@default"
#setup for diff/root
cp -a "/usr/share/runit/sv/installedfull-sv" "/usr/share/runit/sv/fulldiff-sv"
cp -a "/usr/share/runit/sv/installedfull-sv" "/usr/share/runit/sv/fulldiff-sv@default"
#setup for user services
cp -a "/usr/share/runit/sv/installed-sv" "/usr/share/runit/sv/user-sv@user"
cp -a "/usr/share/runit/sv/linklog-sv" "/usr/share/runit/sv/linklog-usersv@user"
cp -a "/usr/share/runit/sv/installedfull-sv" "/usr/share/runit/sv/full-usersv@user"
#setup for diff/user
cp -a "/usr/share/runit/sv/installedfull-sv" "/usr/share/runit/sv/fulldiff-sv@user"


if ! adduser  --comment "cpsv-tesuser" --disabled-password  cpsvtestuser; then
    fail "failed to create user: cpsvtestuser"
else
    if [ -d /home/cpsvtestuser ]; then
        #setup in home
        chpst -u cpsvtestuser mkdir -p /home/cpsvtestuser/.runit/sv
        chpst -u cpsvtestuser mkdir -p /home/cpsvtestuser/.runit/supervise
        chpst -u cpsvtestuser mkdir -p /home/cpsvtestuser/.runit/log
        chpst -u cpsvtestuser mkdir -p /home/cpsvtestuser/.runit/runsvdir/default
        chpst -u cpsvtestuser ln -s /home/cpsvtestuser/.runit/runsvdir/default     /home/cpsvtestuser/.runit/runsvdir/current
        chpst -u cpsvtestuser ln -s /home/cpsvtestuser/.runit/runsvdir/current   /home/cpsvtestuser/service
        dousertest=1
    else
        fail "home dir: /home/cpsvtestuser not found"
    fi
fi

echo "... done"


## test cpsv root usage
#test sync (s)
echo "testing 'cpsv s': root ..."
runtimedir=/usr/share/runit/sv.current
#call  cpsv  as in trigger_sv with -f and CPSV_DEST=/usr/share/runit/sv.now
CPSV_DEST=/usr/share/runit/sv.now CPSV_SOURCE=/usr/share/runit/sv.src  cpsv -f s
#CPSV_DEST=/usr/share/runit/sv.now CPSV_SOURCE=/usr/share/runit/sv.src  cpsv -f s

for dir in uninstalled-sv norun-sv binempty-sv binnopath-sv nobin-sv ; do
    if [ -d "$runtimedir/$dir" ]; then
        fail "service: $dir found in: $runtimedir"
    fi
done

for dir in user-sv@user linklog-usersv@user full-usersv@user ; do
    dir="${dir%@user}"
    if [ -d "$runtimedir/$dir" ]; then #should not strip @user with root usage
        fail "service: $dir found in: $runtimedir with root usage, $dir@user expected "
    fi
done

for dir in installed-sv multi-sv@default linklog-sv installedfull-sv user-sv@user linklog-usersv@user full-usersv@user ; do
    if [ ! -d "$runtimedir/$dir" ]; then
        fail "service: $dir not found in: $runtimedir" && continue
    fi
    if [ ! -x  "$runtimedir/$dir/run" ]; then
        fail "service: $dir: run file not found or not executable in: $runtimedir/$dir" && continue
    fi
done

if [ -d "$runtimedir/linklog-sv/log" ]; then
            if [ ! -h "$runtimedir/linklog-sv/log/run" ]; then
                fail "service: linklog-sv : log/run symlink not found in: $runtimedir/linklog-sv" && continue
            fi
else
             fail "service: linklog-sv : log dir not found in: $runtimedir/linklog-sv"
fi

#run file already tested
for file in check finish control/t log/run env/RSPECIAL_VAR ; do
    if [ ! -f "$runtimedir/installedfull-sv/$file" ]; then
        fail "service: installedfull-sv : $file not found in: $runtimedir/installedfull-sv/" && continue
    fi
    [ "$file" = 'env/RSPECIAL_VAR' ] && continue
    if [ ! -x "$runtimedir/installedfull-sv/$file" ]; then
        fail "service: installedfull-sv : $file not executable in: $runtimedir/installedfull-sv/"
    fi
done

if [ -h "$runtimedir/installedfull-sv/log/run" ]; then
    fail "service: installedfull-sv : /log/run is a symlink in: $runtimedir/installedfull-sv/"
fi

#make sure that missing files/dirs are creted again with cpsv -f s (-a and diff are tested later)
#see 7db5ec7fdb50ba06de646fd9eec9da0698e0fe41
if [ -d $runtimedir/installedfull-sv ]; then
    for rfile in run finish check log/run control/t env/RSPECIAL_VAR .meta/bin supervise log/supervise ; do
        #case: only certin files are missing, cpsv -f s should recreate missing files and log dir
        rm -rf  "$runtimedir/installedfull-sv/$rfile"
        if [ -e $runtimedir/installedfull-sv/$rfile ]; then
            fail "service: installedfull-sv : $rfile found even if removed" && continue
        fi
        CPSV_DEST=/usr/share/runit/sv.now CPSV_SOURCE=/usr/share/runit/sv.src  cpsv -f s
        if [ $rfile = 'supervise' ] || [ $rfile = 'log/supervise' ]; then
            if [ ! -h $runtimedir/installedfull-sv/$rfile ]; then
                fail "service: installedfull-sv : $runtimedir/installedfull-sv/$rfile link not found but expected after cpsv -f s"
            fi
        else
            if [ ! -e $runtimedir/installedfull-sv/$rfile ]; then
                fail "service: installedfull-sv : $runtimedir/installedfull-sv/$rfile not found but expected after cpsv -f s"
            fi
        fi
    done
else
    fail "service: installedfull-sv : not found in: $runtimedir/installedfull-sv/ : skipping remove and rewrite test"
fi
echo "... done"


#test p (multi instance)
echo "testing 'cpsv p': root ..."
cpsv p multi-sv@default multi-sv@instance1
cpsv p installedfull-sv@default installedfull-sv@instance1


for dir in multi-sv@instance1 installedfull-sv@instance1  ; do
    if [ -h /etc/sv/$dir ]; then
        fail "service: $dir: /etc/sv/$dir is a symlink" && continue
    fi
    if [ ! -d /etc/sv/$dir ]; then
        fail "service: $dir: /etc/sv/$dir directory not found" && continue
    fi
    if [ ! -h /etc/sv/$dir/run ]; then
        fail "service: $dir: /etc/sv/$dir: .meta/ or run are not symlinks" && continue
    fi
    if [ -h /etc/sv/$dir/.meta ] || [ ! -d /etc/sv/$dir/.meta ]; then
        fail "service: $dir: /etc/sv/$dir: .meta/ is a symlinks (dir expected)" && continue
    fi
    srcdir=${dir%@user}; srcdir=$srcdir@default
    for metafile in .meta/bin .meta/onupgrade .meta/noreplace .meta/pkg .meta/enable ; do
        if [ -e /usr/share/runit/sv.current/$srcdir/$metafile ]; then
            if [ ! -h /etc/sv/$dir/$metafile ]; then
                fail "service: /etc/sv/$dir: $metafile is not a symlink" && continue
            fi
        fi
    done
    [ "$dir" = 'installedfull-sv@instance1' ] || continue
    # run .meta  check finish control env if any should be symlinks (env??)
    # log should be a directory and log/run a symlink (log: -->no symlinks)
    for links in check finish control env ; do  # run .meta alaready tested
        if [ ! -h /etc/sv/$dir/$links ]; then
            fail "service: $dir: /etc/sv/$dir: $links is not a symlink" && continue
        fi
    done
    for files in control/t env/RSPECIAL_VAR ; do
        if [ ! -f /etc/sv/$dir/$files ]; then
            fail "service: $dir: /etc/sv/$dir: $files file not found" && continue
        fi
    done
    if [ -h /etc/sv/$dir/log ] || [ ! -d /etc/sv/$dir/log ] ; then
        fail "service: $dir: /etc/sv/$dir/log: is not a directory (or is a symlink)" && continue
    fi
    if [ ! -h  /etc/sv/$dir/log/run ]; then
        fail "service: $dir: /etc/sv/$dir/log/run: file is not a symlink" && continue
    fi
done
echo "... done"

## test runit-helper usage (it calls cpsv p on a service that can be installed in /etc/sv/ *only*)
echo "testing 'cpsv p': runit-helper use case..."
cp -a debian/tests/sv/linklog-sv /etc/sv/
mv /etc/sv/linklog-sv /etc/sv/helper-testsv
[ -d /usr/share/runit/sv.current/helper-testsv ] && fail "service: helper-testsv: found in /usr/share/runit/sv.current"
[ ! -d /etc/sv/helper-testsv ] && fail "service: helper-testsv: found in /usr/share/runit/sv.current"
for etclink in supervise log/supervise log/run; do
    [ -e /etc/sv/$etclink ] && fail "service: helper-testsv: $etclink found before 'cpsv p helper-testsv'"
done
cpsv p helper-testsv
#now expect to find supervise links and log/run link
for etclink in supervise log/supervise log/run; do
    [ -h /etc/sv/helper-testsv/$etclink ] || fail "service: helper-testsv: $etclink link not found in /etc/sv/helper-testsv after cpsv p helper-testsv"
done
rm -rf /etc/sv/helper-testsv || true
echo "... done"

##test cpsv d - diff and cpsv (-f) a
## also test for supervise links
echo "testing 'cpsv d' and 'cpsv -f a': root ..."
#copy to /etc/sv/
cpsv a fulldiff-sv
if [ -d /etc/sv/fulldiff-sv ]; then
    cpsv d fulldiff-sv || fail "service: fulldiff-sv: unexpected diff after plain 'cpsv a'"
    if [ ! -h /etc/sv/fulldiff-sv/supervise ]; then
            fail "service: supervise is not a symlink in /etc/sv/fulldiff-sv after cpsv a" && continue
    fi
    if [ ! -h /etc/sv/fulldiff-sv/log/supervise ]; then
            fail "service: log/supervise is not a symlink in /etc/sv/fulldiff-sv after cpsv a" && continue
    fi
    for rfile in run finish check log/run control/t env/RSPECIAL_VAR .meta/bin ; do
        cpsv -f a fulldiff-sv
        if [ ! -e /etc/sv/fulldiff-sv/$rfile ]; then
            fail "service: $rfile: not found in /etc/sv/fulldiff-sv after cpsv a" && continue
        fi
        echo "this is added" >> /etc/sv/fulldiff-sv/$rfile
        #if cpsv d fulldiff-sv >/dev/null ; then
        if cpsv d fulldiff-sv > /dev/null 2>&1 ; then
            fail "service: fulldiff-sv: $rfile is identical but diff is expected" && continue
        fi
        cpsv -f a fulldiff-sv
        if ! cpsv d fulldiff-sv; then
            fail "service: fulldiff-sv: $rfile : unexpected diff after 'cpsv -f a'" && continue
        fi
        #case: only certin files are missing, cpsv -f a should recreate missing files and log dir
        rm -rf  "/etc/sv/fulldiff-sv/$rfile"
        rm -rf "/etc/sv/fulldiff-sv/supervise"
        rm -rf "/etc/sv/fulldiff-sv/log/supervise"
        if cpsv d fulldiff-sv > /dev/null 2>&1 ; then
            fail "service: fulldiff-sv: $rfile removed but no diff" && continue
        fi
        cpsv -f a fulldiff-sv
        if ! cpsv d fulldiff-sv; then
            fail "service: fulldiff-sv: diff after $rfile removed and 'cpsv -f a'" && continue
        fi
        if [ ! -h /etc/sv/fulldiff-sv/supervise ]; then
            fail "service: supervise is not a symlink in /etc/sv/fulldiff-sv after cpsv a($rfile loop)" && continue
        fi
        if [ ! -h /etc/sv/fulldiff-sv/log/supervise ]; then
            fail "service: log/supervise is not a symlink in /etc/sv/fulldiff-sv after cpsv a($rfile loop)" && continue
        fi
        if [ $rfile = 'log/run' ]; then
            rm -rf /etc/sv/fulldiff-sv/log
            if cpsv d fulldiff-sv > /dev/null 2>&1 ; then
                fail "service: fulldiff-sv: log dir removed but no diff" && continue
            fi
            cpsv -f a fulldiff-sv
            if ! cpsv d fulldiff-sv; then
                fail "service: fulldiff-sv: diff after log dir removed and 'cpsv -f a'" && continue
            fi
        fi
    done
    # .meta/wtime should be ignored
    touch /etc/sv/fulldiff-sv/.meta/wtime
    echo "00100020202003" >> /etc/sv/fulldiff-sv/.meta/wtime
    if ! cpsv d fulldiff-sv ; then
        fail "service: fulldiff-sv: unexpected diff, wtime should be ignored" && continue
    fi
    # but 'cpsv -f a' does not handle other extra files..
    touch /etc/sv/fulldiff-sv/extrafile
    echo "this is added" >> /etc/sv/fulldiff-sv/extrafile
    if cpsv d fulldiff-sv > /dev/null 2>&1 ; then
        fail "service: fulldiff-sv: no diff but extrafile is added" && continue
    fi
    cpsv -f a fulldiff-sv
    if cpsv d fulldiff-sv > /dev/null 2>&1 ; then
        fail "service: fulldiff-sv: no diff but extrafile is added after cpsv -f a" && continue
    fi
else
    fail "service: fulldiff-sv: not found in /etc/sv/ after cpsv a, skipping diff test"
fi
#test diff with service named instances/root (created with cpsv p service newname)
echo "testing 'cpsv d' with named instances: root ..."
cpsv p fulldiff-sv@default fulldiff-sv@instance1
if [ -d /etc/sv/fulldiff-sv@instance1 ]; then
    [ -h /etc/sv/fulldiff-sv@instance1 ] && fail "service: /etc/sv/fulldiff-sv@instance1: is a symlink, directory expected"
    cpsv d fulldiff-sv@default fulldiff-sv@instance1 || fail "service: fulldiff-sv@instance1: unexpected diff after plain 'cpsv p'"
        # control/ env/ and .meta/ are symlink so control/t, env/RSPECIAL_VAR and .meta/bin are files
        for rfile in run finish check log/run control env .meta ; do
            #  restore symlinks to a clean state
            rm -rf /etc/sv/fulldiff-sv@instance1
            cpsv p fulldiff-sv@default fulldiff-sv@instance1
            if [ $rfile != '.meta' ]; then
                if [ ! -h /etc/sv/fulldiff-sv@instance1/$rfile ]; then
                    fail "service: /etc/sv/fulldiff-sv@instance1/$rfile: not found or is not a symlink" && continue
                fi
            else
                if [ -h /etc/sv/fulldiff-sv@instance1/$rfile ] || [ ! -d /etc/sv/fulldiff-sv@instance1/$rfile ]; then
                    fail "service: /etc/sv/fulldiff-sv@instance1/$rfile: not found or is not a directory" && continue
                fi
                for metafile in .meta/bin .meta/onupgrade .meta/noreplace .meta/pkg .meta/enable ; do
                    if [ -e /usr/share/runit/sv.current/fulldiff-sv@default/$metafile ]; then
                        if [ ! -h /etc/sv/fulldiff-sv@instance1/$metafile ]; then
                            fail "service: /etc/sv/fulldiff-sv@instance1: $metafile is not a symlink" && continue
                        fi
                    fi
                done
            fi
            case $rfile in
                control)
                    if [ ! -f /etc/sv/fulldiff-sv@instance1/$rfile/t ]; then
                        fail "service: /etc/sv/fulldiff-sv@instance1/$rfile/t: not found or is not a file" && continue
                    fi
                    rm -rf /etc/sv/fulldiff-sv@instance1/$rfile
                    mkdir /etc/sv/fulldiff-sv@instance1/$rfile
                    echo "changed content, parent dir is no longer a symlink" > /etc/sv/fulldiff-sv@instance1/$rfile/t
                ;;
                env)
                    if [ ! -f /etc/sv/fulldiff-sv@instance1/$rfile/RSPECIAL_VAR ]; then
                        fail "service: /etc/sv/fulldiff-sv@instance1/$rfile/RSPECIAL_VAR: not found or is not a file" && continue
                    fi
                    rm -rf /etc/sv/fulldiff-sv@instance1/$rfile
                    mkdir /etc/sv/fulldiff-sv@instance1/$rfile
                    echo "changed content, parent dir is no longer a symlink" > /etc/sv/fulldiff-sv@instance1/$rfile/RSPECIAL_VAR
                ;;
                .meta)
                    if [ ! -f /etc/sv/fulldiff-sv@instance1/$rfile/bin ]; then
                        fail "service: /etc/sv/fulldiff-sv@instance1/$rfile/bin: not found or is not a file" && continue
                    fi
                    rm -rf /etc/sv/fulldiff-sv@instance1/$rfile
                    mkdir /etc/sv/fulldiff-sv@instance1/$rfile
                    echo "changed content, parent dir is no longer a symlink" > /etc/sv/fulldiff-sv@instance1/$rfile/bin
                ;;
                *)
                    rm -rf /etc/sv/fulldiff-sv@instance1/$rfile
                    echo "changed content, file is no longer a symlink" > /etc/sv/fulldiff-sv@instance1/$rfile
                ;;
            esac
#ls -l /etc/sv/fulldiff-sv@instance1
#           if cpsv d fulldiff-sv@default fulldiff-sv@instance1; then
            if cpsv d fulldiff-sv@default fulldiff-sv@instance1 > /dev/null 2>&1 ; then
                fail "service: /etc/sv/fulldiff-sv@instance1: $rfile is identical but diff is expected" && continue
            fi
        done
    rm -rf /etc/sv/fulldiff-sv@instance1
    cpsv p fulldiff-sv@default fulldiff-sv@instance1
    # .meta/wtime should be ignored
    touch /etc/sv/fulldiff-sv@instance1/.meta/wtime
    echo "00100020202003" >> /etc/sv/fulldiff-sv@instance1/.meta/wtime
    if ! cpsv d fulldiff-sv@default fulldiff-sv@instance1 ; then
        fail "service: fulldiff-sv@instance1: unexpected diff, wtime should be ignored" && continue
    fi
    #test extra files..
    touch /etc/sv/fulldiff-sv@instance1/extrafile
    echo "this is added" >> /etc/sv/fulldiff-sv@instance1/extrafile
    if cpsv d fulldiff-sv@default fulldiff-sv@instance1 > /dev/null 2>&1 ; then
        fail "service: fulldiff-sv@instance1: no diff but extrafile is added" && continue
    fi
else
    fail "service: fulldiff-sv@instance1: not found in /etc/sv/ after cpsv p, skipping instance-diff test"
fi

rm -rf /etc/sv/fulldiff-sv || true
rm -rf /usr/share/runit/sv.current/fulldiff-sv || true
rm -rf /usr/share/runit/sv/fulldiff-sv || true
rm -rf /etc/sv/fulldiff-sv@instance1 || true
rm -rf /usr/share/runit/sv.current/fulldiff-sv@default || true
rm -rf /usr/share/runit/sv/fulldiff-sv@default || true

echo "... done"


## test non-root usage (user-services)
if [ "$dousertest" -eq 1 ]; then
    echo "testing cpsv s and p: user services ..."
    #test sync (s) as nonroot
    chpst -u cpsvtestuser cpsv s
    #expect services dirs in /home/cpsvtestuser/.runit/sv populated with symlinks (s): user-sv@user linklog-usersv@user full-usersv@user
    #test p  (user instances as special case of multi-instances)
    chpst -u cpsvtestuser cpsv p linklog-usersv@user newname
    #also expect newname service in /home/cpsvtestuser/.runit/sv populated with symlinks (p)
    for dir in user-sv linklog-usersv newname full-usersv ; do
        if [ -h $homesv/$dir ]; then
            fail "service: $dir: $homesv/$dir is a symlink" && continue
        fi
        if [ ! -d $homesv/$dir ]; then
            fail "service: $dir: $homesv/$dir directory not found" && continue
        fi
        if [ ! -h $homesv/$dir/run ]; then
            fail "service: $dir: $homesv/$dir: run is not a symlink" && continue
        fi
        if [ -h $homesv/$dir/.meta ] || [ ! -d $homesv/$dir/.meta ]; then
            fail "service: $dir: $homesv/$dir: .meta/ is not a directory" && continue
        fi
        for metafile in .meta/bin .meta/onupgrade .meta/noreplace .meta/pkg .meta/enable ; do
            if [ -e /usr/share/runit/sv.current/$dir/$metafile ]; then
                if [ ! -h $homesv/$dir/$metafile ]; then
                    fail "service: $dir: $homesv/$dir: $metafile is not a symlink" && continue
                fi
            fi
        done
        [ "$dir" != 'user-sv' ] || continue
            #log
            if [ -h $homesv/$dir/log ] || [ ! -d $homesv/$dir/log ] ; then
                fail "service: $dir: $homesv/$dir/log: is not a directory (or is a symlink)" && continue
            fi
            if [ ! -e  $homesv/$dir/log/run ]; then
                fail "service: $dir: $homesv/$dir/log/run: not found" && continue
            fi
            # istances have /log/run as symlink too
            if [ ! -h  $homesv/$dir/log/run ]; then
                fail "service: $dir: $homesv/$dir/log/run: file is not a symlink" && continue
            fi
        [ "$dir" = 'full-usersv' ] || continue
            for links in check finish control env ; do  # run .meta alaready tested
                if [ ! -h $homesv/$dir/$links ]; then
                    fail "" && continue
                    rc=$((rc+1)) && echo "FAIL: service: $dir: $homesv/$dir: $links is not a symlink"
                    continue
                fi
            done
            for files in control/t env/RSPECIAL_VAR ; do
                if [ ! -f $homesv/$dir/$files ]; then
                    fail "service: $dir: $homesv/$dir: $files file not found" && continue
                fi
            done
    done
    echo "... done"

    #test cpsv d/user with fulldiff-sv[@user]
    echo "testing cpsv d: user services ..."
        if [ -d $homesv/fulldiff-sv ] ; then
            [ -h $homesv/fulldiff-sv ] && fail "service: fulldiff-sv: $homesv/fulldiff-sv is a symlink, directory expected"
            if  ! chpst -u cpsvtestuser cpsv d fulldiff-sv@user; then
                #TODO the user will likely want to do cpsv d fulldiff-sv without @user!
                fail "service: fulldiff-sv:diff found in $homesv/fulldiff-sv but not expected"
            fi
            # control/ env/ and .meta/ are symlink so control/t, env/RSPECIAL_VAR and .meta/bin are files
            for rfile in run finish check log/run control env .meta ; do
                #  restore symlinks to a clean state
                rm -rf $homesv/fulldiff-sv
                chpst -u cpsvtestuser cpsv p fulldiff-sv@user fulldiff-sv
                if [ $rfile != '.meta' ]; then
                    if [ ! -h $homesv/fulldiff-sv/$rfile ]; then
                        fail "service: $homesv/fulldiff-sv/: $rfile: not found or is not a symlink" && continue
                    fi
                else
                    if [ -h $homesv/fulldiff-sv/$rfile ] || [ ! -d $homesv/fulldiff-sv/$rfile ]; then
                        fail "service:  -h $homesv/fulldiff-sv: $rfile: not found or is not a directory" && continue
                    fi
                    for metafile in .meta/bin .meta/onupgrade .meta/noreplace .meta/pkg .meta/enable ; do
                        if [ -e /usr/share/runit/sv.current/fulldiff-sv@default/$metafile ]; then
                            if [ ! -h $homesv/fulldiff-sv/$metafile ]; then
                                fail "service: $homesv/fulldiff-sv/: $metafile is not a symlink" && continue
                            fi
                        fi
                    done
                fi
                case $rfile in
                    control)
                    if [ ! -f $homesv/fulldiff-sv/$rfile/t ]; then
                        fail "service: $homesv/fulldiff-sv/$rfile/t: not found or is not a file" && continue
                    fi
                    rm -rf $homesv/fulldiff-sv/$rfile
                    mkdir $homesv/fulldiff-sv/$rfile
                    echo "changed content, parent dir is no longer a symlink" > $homesv/fulldiff-sv/$rfile/t
                    ;;
                    env)
                    if [ ! -f $homesv/fulldiff-sv/$rfile/RSPECIAL_VAR ]; then
                        fail "service: $homesv/fulldiff-sv/$rfile/RSPECIAL_VAR: not found or is not a file" && continue
                    fi
                    rm -rf $homesv/fulldiff-sv/$rfile
                    mkdir $homesv/fulldiff-sv/$rfile
                    echo "changed content, parent dir is no longer a symlink" > $homesv/fulldiff-sv/$rfile/RSPECIAL_VAR
                    ;;
                    .meta)
                    if [ ! -f $homesv/fulldiff-sv/$rfile/bin ]; then
                        fail "service: $homesv/fulldiff-sv/$rfile/bin: not found or is not a file" && continue
                    fi
                    rm -rf $homesv/fulldiff-sv/$rfile
                    mkdir $homesv/fulldiff-sv/$rfile
                    echo "changed content, parent dir is no longer a symlink" > $homesv/fulldiff-sv/$rfile/bin
                    ;;
                    *)
                    rm -rf $homesv/fulldiff-sv/$rfile
                    echo "changed content, file is no longer a symlink" > $homesv/fulldiff-sv/$rfile
                    ;;
                esac
#ls -l $homesv/fulldiff-sv
                #if chpst -u cpsvtestuser cpsv d fulldiff-sv@user; then
                if chpst -u cpsvtestuser cpsv d fulldiff-sv@user > /dev/null 2>&1 ; then
                #TODO see above, make it usable with 'cpsv d fulldiff-sv'
                    fail "service: fulldiff-sv: $rfile is identical but diff is expected" && continue
                fi
            done
            rm -rf $homesv/fulldiff-sv
            chpst -u cpsvtestuser cpsv p fulldiff-sv@user fulldiff-sv
            # .meta/wtime should be ignored
            touch $homesv/fulldiff-sv/.meta/wtime
            echo "00100020202003" >> $homesv/fulldiff-sv/.meta/wtime
            if ! chpst -u cpsvtestuser cpsv d fulldiff-sv@user ; then
            fail "service: $homesv/fulldiff-sv: unexpected diff, wtime should be ignored" && continue
            fi
            #test extra files..
            touch $homesv/fulldiff-sv/extrafile
            echo "this is added" >> $homesv/fulldiff-sv/extrafile
            if chpst -u cpsvtestuser cpsv d fulldiff-sv@user > /dev/null 2>&1 ; then
                fail "service: $homesv/fulldiff-sv: no diff but extrafile is added" && continue
            fi
        else
            fail "service: fulldiff-sv: $homesv/fulldiff-sv directory not found, skipping cpsv d/user test"
        fi
#ls -l /usr/share/runit/sv.current/fulldiff-sv@user/
#TODO do not create supervise symlinks in foo@user templates in sv.current
    echo "... done"
fi

##cleanup
#delete test services from /etc/sv, /usr/share/runit/sv.current | sv
#rm -rf ...
echo "test clenup.."
rm -rf /etc/sv/installedfull-sv@instance1 || true
rm -rf /etc/sv/multi-sv@instance1 || true
#rm -rf "$runtimedir/installedfull-sv@default" || true
for dir in $svlist  $usersvlist installedfull-sv@default ; do
    rm -rf "/usr/share/runit/sv/$dir" || true
    rm -rf "/usr/share/runit/sv.current/$dir" || true
done
#delete home and remove user
if ! deluser --remove-home cpsvtestuser; then
    warn "failed to remove user: cpsvtestuser"
fi
echo "... done"

[ "$rc" -eq 0 ] || echo "FATAL: failed test: cpsv: rc is $rc"

exit "$rc"
