#!/bin/bash
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 "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"

# FAN_REPORT_FID support since Linux 5.3
if [[ $(uname -r | cut -f1,2 -d.) > 5.2 ]]; then
    # 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$"
else
    echo "skipping FAN_REPORT_FID tests, not available on this kernel"
fi

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