#!/bin/bash
cvmfs_test_name="Attach mount to a 'zombie' fuse module"
cvmfs_test_suites="quick"
# We disable autofs for this test to get the output from the mount helper
cvmfs_test_autofs_on_startup=false

CVMFS_TEST094_PID_NAMESPACE=

cleanup() {
  if [ ! -z $CVMFS_TEST094_PID_NAMESPACE ]; then
    echo "*** Kill namespaced process $CVMFS_TEST094_PID_NAMESPACE"
    sudo pkill -P $CVMFS_TEST094_PID_NAMESPACE
  fi
  # If the test fails, return to a sane state
  sudo cvmfs_config killall
  sudo rmdir /cvmfs/cvmfs-config.cern.ch /cvmfs/cernvm-prod.cern.ch
}

cvmfs_run_test() {
  logfile=$1

  echo "*** mount cernvm-prod.cern.ch"
  cvmfs_mount cernvm-prod.cern.ch || return 1

  cat /proc/mounts | grep fuse
  cat /proc/self/mountinfo | grep fuse

  local fuse_pid=$(sudo cvmfs_talk -i cernvm-prod.cern.ch pid)
  echo "*** Fuse PID is $fuse_pid"

  echo "*** Detach mount namespace"
  sudo unshare -m bash -c 'cd /cvmfs/cernvm-prod.cern.ch && sleep 10000' &
  CVMFS_TEST094_PID_NAMESPACE=$!
  trap cleanup HUP EXIT TERM INT

  kill -0 $CVMFS_TEST094_PID_NAMESPACE || return 10
  echo "*** PID of process in mount namespace is $CVMFS_TEST094_PID_NAMESPACE"
  ls -lah /proc/self/ns/mnt
  sudo ls -lah /proc/$CVMFS_TEST094_PID_NAMESPACE/ns/mnt

  echo "*** unmount system-wide mount"
  cvmfs_umount cernvm-prod.cern.ch || return 20
  cat /proc/mounts | grep fuse
  cat /proc/self/mountinfo | grep fuse
  ps -eaf | grep cvmfs2

  if [ "x$(sudo cvmfs_talk -i cernvm-prod.cern.ch pid)" != "x$fuse_pid" ]; then
    echo "Fuse daemon should have stayed alive"
    sudo cvmfs_talk -i cernvm-prod.cern.ch pid
    return 21
  fi

  echo "*** try to remount system-wide mount"
  sudo mount -t cvmfs cernvm-prod.cern.ch /cvmfs/cernvm-prod.cern.ch
  if [ $? -ne 0 ]; then
    cat_syslog | grep -e '(cernvm-prod.cern.ch)' | tail -n 8
    return 30
  fi

  ls -lah /cvmfs/cernvm-prod.cern.ch/|| return 31
  cat /proc/mounts | grep fuse
  cat /proc/self/mountinfo | grep fuse

  if [ "x$(sudo cvmfs_talk -i cernvm-prod.cern.ch pid)" != "x$fuse_pid" ]; then
    echo "Fuse daemon should have stayed the same"
    sudo cvmfs_talk -i cernvm-prod.cern.ch pid
    return 32
  fi

  echo "*** Unmount system mount"
  cvmfs_umount cernvm-prod.cern.ch || return 40

  echo "*** Stop namespace'd process"
  sudo kill -0 $CVMFS_TEST094_PID_NAMESPACE || return 41
  sudo pkill -P $CVMFS_TEST094_PID_NAMESPACE || return 42
  while sudo kill -0 $CVMFS_TEST094_PID_NAMESPACE; do
    :
  done
  CVMFS_TEST094_PID_NAMESPACE=

  # Last one turns out the lights (failure caught be timeout)
  while sudo cvmfs_talk -i cernvm-prod.cern.ch pid; do
    sleep 1
  done

  return 0
}
