#!/bin/bash

cvmfs_test_name="Stacktrace from Private Mount Point"

final_cleanup() {
  if ! running_on_osx; then
    sudo fusermount -u $(pwd)/mnt
  fi
  sudo umount -f $(pwd)/mnt
}

cvmfs_run_test() {
  logfile=$1

  local fqrn="atlas.cern.ch"

  # create a mount point and a cache directory
  mkdir mnt || return 1
  mkdir cache || return 2

  # create a local configuration file
  cat > local.conf << EOF
CVMFS_CACHE_BASE=$(pwd)/cache
CVMFS_RELOAD_SOCKETS=$(pwd)/cache
CVMFS_SERVER_URL=http://cvmfs-stratum-one.cern.ch/cvmfs/${fqrn}
CVMFS_HTTP_PROXY=DIRECT
CVMFS_TIMEOUT=30
CVMFS_TIMEOUT_DIRECT=30
CVMFS_KEYS_DIR=/etc/cvmfs/keys/cern.ch
EOF

  # mount the private repository
  cvmfs2 -o config=$(pwd)/local.conf $fqrn $(pwd)/mnt || return 4
  ls mnt || return 5

  # find out the PID of the mounted cvmfs process
  local pid=$(sudo cvmfs_talk -p $(pwd)/cache/${fqrn}/cvmfs_io.${fqrn} pid)

  # kill this cvmfs2 process
  sudo kill -s SIGSEGV $pid || { final_cleanup; return 6; }
  sleep 20

  # check if we got a stacktrace of a decent length
  local stacktrace_path="cache/${fqrn}/stacktrace.${fqrn}"
  [ -f $stacktrace_path ] || { final_cleanup; return 7; }
  [ $(sudo cat $stacktrace_path | wc -l) -gt 20 ] || { final_cleanup; return 8; }
  if ! sudo grep '(gdb)' $stacktrace_path > /dev/null 2>&1 && \
     ! sudo grep '(lldb)' $stacktrace_path > /dev/null 2>&1; then
     final_cleanup
     return 9
  fi
  sudo cat $stacktrace_path

  # clean up the broken mount point
  final_cleanup

  return 0
}

