#!/bin/bash

cvmfs_test_name="Extended attributes"
cvmfs_test_autofs_on_startup=false
cvmfs_test_suites="quick"

# Requires aufs ready for extended attributes

verify_xattrs() {
  local attr1=$(attr -qg foo /cvmfs/$CVMFS_TEST_REPO/xattr)
  # local attr2=$(attr -qg x /cvmfs/$CVMFS_TEST_REPO/link)
  local attr3=$(attr -qg foo2 /cvmfs/$CVMFS_TEST_REPO/dir/xattr)
  local attr4=$(attr -qg baz /cvmfs/$CVMFS_TEST_REPO/dir)
  if [ "x$attr1" != "xbar" ]; then
    return 20
  fi
  # if [ "x$attr2" != "xY" ]; then
  #   return 21
  # fi
  if [ "x$attr3" != "xbar2" ]; then
    return 22
  fi
  if [ "x$attr4" != "xBAZ" ]; then
    return 23
  fi
  setcap -q -v "cap_chown=ep" /cvmfs/$CVMFS_TEST_REPO/dir/capabilities || return 24

  return 0
}

verify_no_xattrs() {
  attr -qg foo /cvmfs/$CVMFS_TEST_REPO/xattr && return 80
  attr -qg foo2 /cvmfs/$CVMFS_TEST_REPO/dir/xattr && return 81
  attr -qg baz /cvmfs/$CVMFS_TEST_REPO/dir && return 82

  return 0
}

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

  echo "*** create a fresh repository named $CVMFS_TEST_REPO with user $CVMFS_TEST_USER"
  create_empty_repo $CVMFS_TEST_REPO $CVMFS_TEST_USER || return $?
  sudo sh -c "echo CVMFS_INCLUDE_XATTRS=true >> /etc/cvmfs/repositories.d/${CVMFS_TEST_REPO}/server.conf"

  echo "*** create extended attributes"
  start_transaction $CVMFS_TEST_REPO || return $?
  touch /cvmfs/$CVMFS_TEST_REPO/xattr
  ln -s 404 /cvmfs/$CVMFS_TEST_REPO/link
  mkdir /cvmfs/$CVMFS_TEST_REPO/dir
  touch /cvmfs/$CVMFS_TEST_REPO/dir/xattr
  touch /cvmfs/$CVMFS_TEST_REPO/dir/capabilities

  attr -s foo -V bar /cvmfs/$CVMFS_TEST_REPO/xattr || return 10
  # attr -s x -V Y /cvmfs/$CVMFS_TEST_REPO/link || return 11
  attr -s foo2 -V bar2 /cvmfs/$CVMFS_TEST_REPO/dir/xattr || return 12
  attr -s baz -V BAZ /cvmfs/$CVMFS_TEST_REPO/dir || return 13
  sudo setcap "cap_chown=p cap_chown+e" /cvmfs/$CVMFS_TEST_REPO/dir/capabilities || return 14

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

  verify_xattrs
  local verify_result=$?
  if [ $verify_result -ne 0 ]; then
    return $verify_result
  fi
  echo "*** check catalog and data integrity {1}"
  check_repository $CVMFS_TEST_REPO -i || return $?

  echo "*** Split catalogs and create a nested catalog having files with xattrs"
  start_transaction $CVMFS_TEST_REPO || return $?
  touch /cvmfs/$CVMFS_TEST_REPO/dir/.cvmfscatalog
  publish_repo $CVMFS_TEST_REPO || return $?
  verify_xattrs
  local verify_result=$?
  if [ $verify_result -ne 0 ]; then
    return $verify_result
  fi
  echo "*** check catalog and data integrity {2}"
  check_repository $CVMFS_TEST_REPO -i || return $?

  echo "*** Merge the catalogs back"
  start_transaction $CVMFS_TEST_REPO || return $?
  rm -f /cvmfs/$CVMFS_TEST_REPO/dir/.cvmfscatalog
  publish_repo $CVMFS_TEST_REPO || return $?
  verify_xattrs
  local verify_result=$?
  if [ $verify_result -ne 0 ]; then
    return $verify_result
  fi
  echo "*** check catalog and data integrity {3}"
  check_repository $CVMFS_TEST_REPO -i || return $?

  echo "*** Remove xattrs"
  start_transaction $CVMFS_TEST_REPO || return $?
  attr -r foo /cvmfs/$CVMFS_TEST_REPO/xattr || return 10
  attr -r foo2 /cvmfs/$CVMFS_TEST_REPO/dir/xattr || return 91
  attr -r baz /cvmfs/$CVMFS_TEST_REPO/dir || return 92
  publish_repo $CVMFS_TEST_REPO || return $?
  verify_no_xattrs
  local verify_result=$?
  if [ $verify_result -ne 0 ]; then
    return $verify_result
  fi
  echo "*** check catalog and data integrity {4}"
  check_repository $CVMFS_TEST_REPO -i || return $?

  return 0
}

