#!/bin/bash
cvmfs_test_name="Garbage collection of auxiliary objects"
cvmfs_test_autofs_on_startup=false

CVMFS_TEST637_REPLICA_NAME=

cleanup() {
  sudo cvmfs_server rmfs -f $CVMFS_TEST637_REPLICA_NAME > /dev/null 2>&1
}

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

  echo "*** create a gc-enabled repository named $CVMFS_TEST_REPO with user $CVMFS_TEST_USER"
  create_empty_repo $CVMFS_TEST_REPO $CVMFS_TEST_USER NO -z -g || return 10
  disable_auto_garbage_collection $CVMFS_TEST_REPO || return 11
  check_repository $CVMFS_TEST_REPO -i  || return 12

  echo "*** gathering initial aux hashes"
  local certificate_t0=$(get_object_from_manifest $CVMFS_TEST_REPO X)
  local history_t0=$(get_object_from_manifest $CVMFS_TEST_REPO H)
  local metainfo_t0=$(get_object_from_manifest $CVMFS_TEST_REPO M)
  echo "--> certificate: $certificate_t0"
  echo "--> history: $history_t0"
  echo "--> meta info: $metainfo_t0"

  echo "*** wait for the clock moving forward"
  sleep 5

  echo "*** run a transaction"
  start_transaction $CVMFS_TEST_REPO || return 13
  publish_repo $CVMFS_TEST_REPO || return 14
  local history_t1=$(get_object_from_manifest $CVMFS_TEST_REPO H)
  echo "--> new history: $history_t1"

  echo "*** set stratum 1 cleanup trap"
  CVMFS_TEST637_REPLICA_NAME="$(get_stratum1_name $CVMFS_TEST_REPO)"
  trap cleanup EXIT HUP INT TERM

  echo "*** snapshot initial repository revision"
  load_repo_config $CVMFS_TEST_REPO
  create_stratum1 $CVMFS_TEST637_REPLICA_NAME            \
                  $CVMFS_TEST_USER                       \
                  $CVMFS_STRATUM0                        \
                  /etc/cvmfs/keys/${CVMFS_TEST_REPO}.pub || return 20
  sudo cvmfs_server snapshot $CVMFS_TEST637_REPLICA_NAME || return 21
  check_repository $CVMFS_TEST637_REPLICA_NAME -i || return 22

  echo "*** check presence of initial aux objects"
  peek_backend $CVMFS_TEST_REPO $certificate_t0 || return 30
  peek_backend $CVMFS_TEST_REPO $history_t0 || return 31
  peek_backend $CVMFS_TEST_REPO $metainfo_t0 || return 32
  peek_backend $CVMFS_TEST637_REPLICA_NAME $certificate_t0 || return 33
  peek_backend $CVMFS_TEST637_REPLICA_NAME $history_t1 || return 34
  peek_backend $CVMFS_TEST637_REPLICA_NAME $metainfo_t0 || return 35

  echo "*** remove old history"
  cvmfs_server gc -f -r0 -l $CVMFS_TEST_REPO || return 40
  cvmfs_server gc -f -r0 -l $CVMFS_TEST637_REPLICA_NAME || return 41
  peek_backend $CVMFS_TEST_REPO $certificate_t0 || return 42
  peek_backend $CVMFS_TEST_REPO $history_t0 && return 43
  peek_backend $CVMFS_TEST_REPO $metainfo_t0 || return 44
  peek_backend $CVMFS_TEST637_REPLICA_NAME $certificate_t0 || return 45
  peek_backend $CVMFS_TEST637_REPLICA_NAME $history_t1 || return 46
  peek_backend $CVMFS_TEST637_REPLICA_NAME $metainfo_t0 || return 47

  echo "*** wait for the clock moving forward (again)"
  sleep 5

  echo "*** change meta info"
  echo '{}' > meta-info
  cvmfs_server update-repoinfo -f meta-info $CVMFS_TEST_REPO || return 50
  local metainfo_t2=$(get_object_from_manifest $CVMFS_TEST_REPO M)
  echo "--> new meta info: $metainfo_t2"

  echo "*** now the catalog in s0 reflog is newer than on s1 reflog,"
  echo "    republish before snapshotting to restore space and time"
  start_transaction $CVMFS_TEST_REPO || return 51
  publish_repo $CVMFS_TEST_REPO || return 52
  local history_t2=$(get_object_from_manifest $CVMFS_TEST_REPO H)
  echo "--> latest history: $history_t2"

  echo "*** run snapshot"
  sudo cvmfs_server snapshot $CVMFS_TEST637_REPLICA_NAME || return 53

  echo "*** another gc run should remove old meta info objects (time `date`)"
  cvmfs_server gc -f -r0 -l -L log_s0 $CVMFS_TEST_REPO || return 60
  cvmfs_server gc -f -r0 -l -L log_s1 $CVMFS_TEST637_REPLICA_NAME || return 61
  peek_backend $CVMFS_TEST_REPO $certificate_t0 || return 62
  peek_backend $CVMFS_TEST_REPO $metainfo_t0 && return 63
  peek_backend $CVMFS_TEST_REPO $metainfo_t2 || return 64
  peek_backend $CVMFS_TEST637_REPLICA_NAME $certificate_t0 || return 65
  peek_backend $CVMFS_TEST637_REPLICA_NAME $history_t2 || return 66
  peek_backend $CVMFS_TEST637_REPLICA_NAME $metainfo_t0 && return 67
  peek_backend $CVMFS_TEST637_REPLICA_NAME $metainfo_t2 || return 68

  echo "*** checking deletion logs"
  grep 'M$' log_s0 || return 70
  grep 'M$' log_s1 || return 71

  return 0
}
