#!/bin/sh
set -euC

if ! type mkfs.btrfs >/dev/null 2>&1; then
    echo "SKIP: mkfs.btrfs not installed"
    exit 0
fi

LOG="$AUTOPKGTEST_TMP/fatrace.log"
IMAGE="$AUTOPKGTEST_TMP/btrfs.img"
MOUNT="$AUTOPKGTEST_TMP/mount"

dd if=/dev/zero of="$IMAGE" bs=1M count=200
mkfs.btrfs --quiet "$IMAGE"
mkdir -p "$MOUNT"
mount -o loop "$IMAGE" "$MOUNT"
trap "umount -l '$MOUNT'" EXIT INT QUIT PIPE

cd "$MOUNT"

echo "hello" > world.txt

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

echo "read a file..."
head world.txt > /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 world.txt file
check_log "RC\?O\? $(pwd)/world.txt$"
# 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$"

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