#!/bin/bash

cvmfs_test_name="Test inodes of chunked files in NFS mode"
cvmfs_test_autofs_on_startup=false
cvmfs_test_suites="quick"

TEST668_PRIVATE_MOUNT=
TEST668_TAIL_PID=

private_mount() {
  local mntpnt="$1"
  TEST668_PRIVATE_MOUNT="$mntpnt"
  do_local_mount "$mntpnt"          \
                 "$CVMFS_TEST_REPO" \
                 "$(get_repo_url $CVMFS_TEST_REPO)" \
                 "" \
                 "CVMFS_NFS_SOURCE=yes" || return 1
}

cleanup() {
  echo "running cleanup()..."
  if [ "x$TEST668_TAIL_PID" != "x" ]; then
    /bin/kill -9 $TEST668_TAIL_PID
  fi
  if [ "x$TEST668_PRIVATE_MOUNT" != "x" ]; then
    sudo umount $TEST668_PRIVATE_MOUNT
  fi
}


cvmfs_run_test() {
  local logfile=$1
  local script_location=$2
  local scratch_dir=$(pwd)

  echo "*** set a trap for system directory cleanup"
  trap cleanup EXIT HUP INT TERM

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

  local size=$((32*1024*1024))
  echo "*** put a a large file into $CVMFS_TEST_REPO"
  start_transaction $CVMFS_TEST_REPO                              || return $?
  mkdir /cvmfs/$CVMFS_TEST_REPO/dir                               || return 3
  yes | head -c $size > /cvmfs/$CVMFS_TEST_REPO/dir/large         || return 3
  publish_repo $CVMFS_TEST_REPO -v                                || return $?

  local mntpnt="${scratch_dir}/private_mnt"
  echo "*** mount private mount point"
  private_mount $mntpnt || return 20
  [ "x$(tail -n 1 ${mntpnt}/dir/large)" = "xy" ] || return 21

  local revision_old=$(get_xattr revision ${mntpnt}) || return 25
  echo "*** revision is $revision_old"

  echo "*** verify that large file is chunked"
  local no_chunks=$(get_xattr chunks ${mntpnt}/dir/large) || return 21
  [ $no_chunks -gt 1 ] || return 22

  echo "*** open file descriptors"
  tail -f ${mntpnt}/dir/large &
  TEST668_TAIL_PID=$!

  echo "*** change contents of large file"
  ls -lisa ${mntpnt}/dir/*
  start_transaction $CVMFS_TEST_REPO                         || return $?
  yes n | head -c $size > /cvmfs/$CVMFS_TEST_REPO/dir/large  || return 30
  publish_repo $CVMFS_TEST_REPO -v                           || return $?

  echo "*** remount private mount point"
  sudo cvmfs_talk -p ${mntpnt}c/$CVMFS_TEST_REPO/cvmfs_io.$CVMFS_TEST_REPO remount sync || return 40
  local revision_new=$(get_xattr revision ${mntpnt}) || return 41
  echo "revision is now $revision_new"
  [ $revision_new -gt $revision_old ] || return 42

  echo "*** verify new content"
  ls -lisa ${mntpnt}/dir/*
  [ "x$(tail -n 1 ${mntpnt}/dir/large)" = "xn" ] || return 50

  echo "*** verify that our open tail processes did acutally run"
  /bin/kill -TERM $TEST668_TAIL_PID || return 61
  TEST668_TAIL_PID=

  return 0
}
