#!/bin/bash
cvmfs_test_name="Preload cache"
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

        mkdir nested
        touch nested/.cvmfscatalog
        touch nested/empty

	popdir
}


CVMFS_TEST_541_MOUNTPOINT=""
cleanup() {
  echo "running cleanup()"
  if [ ! -z $CVMFS_TEST_541_MOUNTPOINT ]; then
    sudo fusermount -u $CVMFS_TEST_541_MOUNTPOINT
    sudo umount        $CVMFS_TEST_541_MOUNTPOINT
  fi
}

cvmfs_run_test() {
  logfile=$1
  local repo_dir=/cvmfs/$CVMFS_TEST_REPO
  local repo_url=$(get_repo_url $CVMFS_TEST_REPO)

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

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

  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 "check catalog and data integrity"
  check_repository $CVMFS_TEST_REPO -i || return $?

  local preload_dir=$scratch_dir/preload_dir
  echo "preloading $preload_dir"
  mkdir -p $preload_dir || return 10
  cvmfs2 __MK_ALIEN_CACHE__ $preload_dir $(id -u $CVMFS_TEST_USER) $(id -g $CVMFS_TEST_USER) || return 11
  mkdir $preload_dir/sync_temp || return 12
  cvmfs_swissknife pull -c \
    -u $repo_url \
    -r $preload_dir \
    -k /etc/cvmfs/keys/$CVMFS_TEST_REPO.pub \
    -m $CVMFS_TEST_REPO \
    -x $preload_dir/sync_temp || return 13
  cvmfs_swissknife pull -c \
    -u $repo_url \
    -r $preload_dir \
    -k /etc/cvmfs/keys/$CVMFS_TEST_REPO.pub \
    -m $CVMFS_TEST_REPO \
    -x $preload_dir/sync_temp || return 14

  echo "compare the results of cvmfs to our reference copy"
  mkdir cache
  mkdir mnt
# create a local configuration file
  cat > local.conf << EOF
CVMFS_CACHE_BASE=$(pwd)/cache
CVMFS_QUOTA_LIMIT=-1
CVMFS_RELOAD_SOCKETS=$(pwd)/cache
CVMFS_ALIEN_CACHE=$preload_dir
CVMFS_SERVER_URL=NOAVAIL
CVMFS_HTTP_PROXY=NOAVAIL
CVMFS_PUBLIC_KEY=/etc/cvmfs/keys/$CVMFS_TEST_REPO.pub
EOF


  # echo "install a desaster cleanup function"
  CVMFS_TEST_541_MOUNTPOINT="$(pwd)/mnt"
  trap cleanup EXIT HUP INT TERM || return 15

  cvmfs2 -o config=$(pwd)/local.conf $CVMFS_TEST_REPO $CVMFS_TEST_541_MOUNTPOINT || return 20
  compare_directories $repo_dir                  $reference_dir $CVMFS_TEST_REPO || return 21
  compare_directories $CVMFS_TEST_541_MOUNTPOINT $reference_dir $CVMFS_TEST_REPO || return 22

  return 0
}

