#!/bin/bash

cvmfs_test_name="Backend In Symlinked Directory"
cvmfs_test_autofs_on_startup=false
cvmfs_test_suites="quick"

produce_files_in() {
	local working_dir=$1

	pushdir $working_dir

	echo "meaningless file content" > file
	echo "more clever file content" > clever

	mkdir foo
	mkdir bar

	mkdir foo/bar
	mkdir bar/foo

	ln file hardlinkToFile
	ln -s clever symlinkToClever

	popdir
}

CVMFS_TEST_537_REPO_CREATED=0
CVMFS_TEST_537_SELINUX_DISABLED=0
CVMFS_TEST_537_ALT_BACKEND=
cleanup() {
  echo "running cleanup..."
  [ $CVMFS_TEST_537_REPO_CREATED     -eq 0 ] || destroy_repo $CVMFS_TEST_REPO
  [ $CVMFS_TEST_537_SELINUX_DISABLED -eq 0 ] || sudo setenforce 1
  [ -z $CVMFS_TEST_537_ALT_BACKEND         ] || sudo rm -fR $CVMFS_TEST_537_ALT_BACKEND
}

cvmfs_run_test() {
  logfile=$1
  local repo_dir=/cvmfs/$CVMFS_TEST_REPO
  local selinux_disabled=0

  local scratch_dir=$(pwd)
  mkdir reference_dir
  local reference_dir=$scratch_dir/reference_dir

  local backend_dir="/srv/cvmfs/${CVMFS_TEST_REPO}"
  local alternative_backend="/opt/cvmfs"
  local symlink_destination="${alternative_backend}/${CVMFS_TEST_REPO}"

  echo "create a symlink for the backend storage of $CVMFS_TEST_REPO"
  destroy_repo $CVMFS_TEST_REPO && echo "-> removed previous $CVMFS_TEST_REPO"
  if [ -d $backend_dir ]; then
    echo -n "removing old backend directory... "
    sudo rm -fR $backend_dir || { echo "fail!"; return 1; }
    echo "done"
  fi
  CVMFS_TEST_537_ALT_BACKEND="$alternative_backend"
  sudo mkdir -p $symlink_destination || return 2
  sudo chown $CVMFS_TEST_USER:$CVMFS_TEST_USER $symlink_destination || return 2
  sudo ln --symbolic $symlink_destination $backend_dir || return 3

  echo "register cleanup trap"
  trap cleanup EXIT HUP INT TERM || return $?

  if has_selinux; then
    echo "make sure that SELinux does not interfere"
    CVMFS_TEST_537_SELINUX_DISABLED=1
    sudo setenforce 0 || return 6
  fi

  echo "create a fresh repository named $CVMFS_TEST_REPO with user $CVMFS_TEST_USER"
  create_empty_repo $CVMFS_TEST_REPO $CVMFS_TEST_USER || return $?
  CVMFS_TEST_537_REPO_CREATED=1

  echo "check that repository backend is redirected"
  [ -f ${symlink_destination}/.cvmfspublished ] || return 4
  [ -d ${symlink_destination}/data ]            || return 5

  # ============================================================================

  echo "starting transaction to edit repository"
  start_transaction $CVMFS_TEST_REPO || return $?

  echo "putting some stuff in the new repository"
  produce_files_in $repo_dir || return 3

  echo "putting exactly the same stuff in the scratch space for comparison"
  produce_files_in $reference_dir || return 4

  echo "creating CVMFS snapshot"
  publish_repo $CVMFS_TEST_REPO || return $?

  echo "compare the results of cvmfs to our reference copy"
  compare_directories $repo_dir $reference_dir $CVMFS_TEST_REPO || return $?

  # ============================================================================

  echo "check catalog and data integrity"
  check_repository $CVMFS_TEST_REPO -i || return $?

  return 0
}

