#!/bin/bash
cvmfs_test_name="tracing"
cvmfs_test_suites="quick"

CVMFS_TEST080_TRACELOG=

cleanup() {
  if [ "x$CVMFS_TEST080_TRACELOG" != "x" ]; then
    sudo rm -f /tmp/cvmfs-$repo.trace.log 2> /dev/null
  fi
}

cvmfs_run_test() {
  logfile=$1
  local repo="grid.cern.ch"
  CVMFS_TEST080_TRACELOG=/tmp/cvmfs-$repo.trace.log
  echo "*** Setup..."
  cleanup
  trap cleanup HUP EXIT TERM INT || return 4
  echo "*** Mounting test repository..."
  cvmfs_mount $repo "GLITE_VERSION=util" \
    "CVMFS_TRACEFILE=$CVMFS_TEST080_TRACELOG" \
    "CVMFS_TRACEBUFFER=4096" \
    "CVMFS_TRACEBUFFER_THRESHOLD=2048" > /dev/null

  echo "Checking trace log creation..."
  sudo cvmfs_talk -i $repo tracebuffer flush > /dev/null

  if [ ! -f $CVMFS_TEST080_TRACELOG ]; then
    echo "*** ERROR: Log file was not created"
    return 2
  fi

  sudo truncate -s0 $CVMFS_TEST080_TRACELOG > /dev/null

  echo "*** Executing a few operations to check tracing..."

  ls /cvmfs/$repo/vc/bin
  stat /cvmfs/$repo/README
  ls /cvmfs/$repo/
  cat /cvmfs/$repo/README
  df -P /cvmfs/$repo/README
  list_xattrs /cvmfs/$repo/README
  get_xattr revision /cvmfs/$repo/README
  ls /cvmfs/$repo/glite

  sudo cvmfs_talk -i $repo tracebuffer flush > /dev/null

  if ! running_on_osx; then
    check_trace 2 opendir ""         || return 10
    check_trace 4 lookup "/vc"       || return 11
  fi
  check_trace 4 lookup "/vc/bin"     || return 12
  check_trace 2 opendir "/vc/bin"    || return 13
  if running_on_osx; then
    check_trace 6 getattr "/README"  || return 14
  else
    check_trace 4 lookup "/README"   || return 14
  fi
  check_trace 1 open "/README"       || return 15
  if running_on_osx; then
    check_trace 5 statfs ""          || return 16
  else
    check_trace 5 statfs "/README"   || return 16
  fi
  check_trace 7 listxattr "/README"  || return 17
  check_trace 8 getxattr "/README"   || return 18
  if ! running_on_osx; then
    check_trace 4 lookup "/glite"    || return 19
    check_trace 4 lookup "/util"     || return 21
  fi
  check_trace 3 readlink "/glite"    || return 20
  check_trace 2 opendir "/util"      || return 22

  return 0
}

check_trace() {
  if ! sudo grep -q "\"$1\",\"$3\",\"$2()\"" $CVMFS_TEST080_TRACELOG; then
    echo "*** Log did not trace $2 of $3"
    echo "----- Full Log -----"
    sudo cat $CVMFS_TEST080_TRACELOG
    echo "----- EOF -----"
    return 1
  fi
}
