#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Run filesystem operations tests on an 1 MiB disk image that is formatted with
# a vfat filesystem and mounted in a temporary directory using a loop device.
#
# Copyright 2022 Red Hat Inc.
# Author: Javier Martinez Canillas <javierm@redhat.com>

set -e
set -u
set -o pipefail

BASE_DIR="$(dirname $0)"
TMP_DIR="$(mktemp -d /tmp/fat_tests_tmp.XXXXXX)"
IMG_PATH="${TMP_DIR}/fat.img"
MNT_PATH="${TMP_DIR}/mnt"

cleanup()
{
    mountpoint -q "${MNT_PATH}" && unmount_image
    rm -rf "${TMP_DIR}"
}
trap cleanup SIGINT SIGTERM EXIT

create_loopback()
{
    touch "${IMG_PATH}"
    chattr +C "${IMG_PATH}" >/dev/null 2>&1 || true

    truncate -s 1M "${IMG_PATH}"
    mkfs.vfat "${IMG_PATH}" >/dev/null 2>&1
}

mount_image()
{
    mkdir -p "${MNT_PATH}"
    sudo mount -o loop "${IMG_PATH}" "${MNT_PATH}"
}

rename_exchange_test()
{
    local rename_exchange="${BASE_DIR}/rename_exchange"
    local old_path="${MNT_PATH}/old_file"
    local new_path="${MNT_PATH}/new_file"

    echo old | sudo tee "${old_path}" >/dev/null 2>&1
    echo new | sudo tee "${new_path}" >/dev/null 2>&1
    sudo "${rename_exchange}" "${old_path}" "${new_path}" >/dev/null 2>&1
    sudo sync -f "${MNT_PATH}"
    grep new "${old_path}" >/dev/null 2>&1
    grep old "${new_path}" >/dev/null 2>&1
}

rename_exchange_subdir_test()
{
    local rename_exchange="${BASE_DIR}/rename_exchange"
    local dir_path="${MNT_PATH}/subdir"
    local old_path="${MNT_PATH}/old_file"
    local new_path="${dir_path}/new_file"

    sudo mkdir -p "${dir_path}"
    echo old | sudo tee "${old_path}" >/dev/null 2>&1
    echo new | sudo tee "${new_path}" >/dev/null 2>&1
    sudo "${rename_exchange}" "${old_path}" "${new_path}" >/dev/null 2>&1
    sudo sync -f "${MNT_PATH}"
    grep new "${old_path}" >/dev/null 2>&1
    grep old "${new_path}" >/dev/null 2>&1
}

unmount_image()
{
    sudo umount "${MNT_PATH}" &> /dev/null
}

create_loopback
mount_image
rename_exchange_test
rename_exchange_subdir_test
unmount_image

exit 0