#!/bin/sh
set -euC

LOG="$AUTOPKGTEST_TMP/fatrace.log"
echo "starting fatrace..."
fatrace --current-mount -s 2 -o $LOG &
sleep 1

echo "read a file..."
head NEWS > /dev/null

echo "create a file..."
TEST_FILE=test.txt
touch "$TEST_FILE"
set +C
bash -c "echo hello > '$TEST_FILE'"
set -C
rm "$TEST_FILE"

echo "moving a file within the same directory"
touch "$TEST_FILE"
mv "$TEST_FILE" "${TEST_FILE}.2"
mkdir dest
mv "${TEST_FILE}.2" dest/"${TEST_FILE}.2"
rm dest/"${TEST_FILE}.2"
rmdir dest

echo "robustness against ELOOP"
ln -s nothing link
python3 -c 'import os; os.open("link", os.RDONLY | os.NOFOLLOW)' 2>/dev/null || true
rm link

echo "waiting for fatrace..."
wait

echo "checking log..."
RC=0
check_log() {
    if ! grep -q "$1" $LOG; then
        echo "$1 not found in log" >&2
        ((RC=RC+1))
    fi
}

# accessing the NEWS file
check_log "RC\?O\? \+$(pwd)/NEWS$"
# file creation
TEST_FILE=$(realpath "$TEST_FILE")
check_log "^touch.* C\?W\?O \+$TEST_FILE"
check_log "^touch.* C\?WO\? \+$TEST_FILE"
check_log "^bash(.* C\?WO\? \+$TEST_FILE"

# file deletion
check_log "^rm(.*): D   $(dirname $TEST_FILE)$"

# dir creation
check_log "^touch(.*): +   $(dirname $TEST_FILE)$"
check_log "^mkdir(.*): +   $(dirname $TEST_FILE)$"

# file renaming; usually one event, but can be two
check_log "^mv(.*): <>\? \+$(dirname $TEST_FILE)"
check_log "^mv(.*): <\?> \+$(dirname $TEST_FILE)"

# file moving
check_log "^mv(.*): <   $(dirname $TEST_FILE)$"
check_log "^mv(.*): >   $(dirname $TEST_FILE)/dest$"

# ELOOP ln/rm
check_log "^ln(.*): +   $(dirname $TEST_FILE)$"
check_log "^rm(.*): D   $(dirname $TEST_FILE)$"

if [ $RC -ne 0 ]; then
   echo "$RC checks failed -- log:" >&2
   echo "===================" >&2
   cat $LOG >&2
   echo "===================" >&2
fi

exit $RC
