#!/bin/bash
cvmfs_test_name="Telemetry Aggregator: Influx"
cvmfs_test_autofs_on_startup=false
cvmfs_test_suites="quick"

source ./src/098-telemetry/setup_teardown

TEST098_REPO=lhcb.cern.ch
TEST098_MOUNTPOINT=/cvmfs/lhcb.cern.ch

CVMFS_TEST_098_TMPFILE=
CVMFS_TEST_098_PYTHON_SCRIPT=

check_counter_increase() {
  echo "Check detection of counter change"

  echo "   Mount $TEST098_REPO"
  test098_mount $TEST098_REPO "CVMFS_TELEMETRY_SEND=ON
CVMFS_TELEMETRY_RATE=5
CVMFS_INFLUX_HOST=localhost
CVMFS_INFLUX_PORT=8092
CVMFS_INFLUX_METRIC_NAME=cvmfs_client_counters"


  echo "   UDP Listener: wait for 1 package from $TEST098_REPO"
  # -W 1 ends the command after receiving 1 package
  $CVMFS_SYS_PYTHON $CVMFS_TEST_098_PYTHON_SCRIPT -d localhost -p 8092 -m 1 -i lhcb > $CVMFS_TEST_098_TMPFILE

  echo "   Do something to change counters"
  cat /cvmfs/$TEST098_REPO/*.sh > /dev/null

  echo "   UDP Listener: Wait for another package from $TEST098_REPO"
  $CVMFS_SYS_PYTHON $CVMFS_TEST_098_PYTHON_SCRIPT -d localhost -p 8092 -m 1 -i lhcb >> $CVMFS_TEST_098_TMPFILE

  echo "   Umount $TEST098_REPO"
  test098_unmount $TEST098_REPO

  # do comparison
  echo "   Check output in file $CVMFS_TEST_098_TMPFILE"
  local found=$(grep $CVMFS_TEST_098_TMPFILE -e "catalog_revision" | wc -l)

  echo "      Right number of lines?"
  [ "$found" -eq "3" ] || return 10
  
  echo "      Changes registered?"
  # gets for 1 field all the values, sorts them and extracts the unique values
  # counts the number of unique values
  # to have registered changes #values must be > 2
  # no changes are 2 values because: delta = 0, absolute value=X
  local count_static_absolute=$(grep $CVMFS_TEST_098_TMPFILE -e "absolute"\
                      | awk '{split($0,a,"n_certificate_misses="); split(a[2],b,","); print b[1]}'\
                      | sort | uniq | wc -l)
  local check_delta_static=$(grep $CVMFS_TEST_098_TMPFILE -e "_delta"\
                      | awk '{split($0,a,"n_certificate_misses="); split(a[2],b,","); print b[1]}')
  local count_dynamic_absolute=$(grep $CVMFS_TEST_098_TMPFILE -e "absolute"\
                       | awk '{split($0,a,"md5_path_cache.n_miss="); split(a[2],b,","); print b[1]}'\
                       | sort | uniq | wc -l)
  local check_delta_dynamic=$(grep $CVMFS_TEST_098_TMPFILE -e "_delta"\
                      | awk '{split($0,a,"md5_path_cache.n_miss="); split(a[2],b,","); print b[1]}')

  # static value: 1 unique value in absolute and delta value must be 0
  echo "Check results"
  echo "Static value"
  echo "   1 unique value in absolute"
  [ "$count_static_absolute" -eq "1" ] || return 11
  echo "   delta value must be 0"
  [ "$check_delta_static" -eq "0" ] || return 12

  # dynamic value: 2 unique values in absolute and delta value must NOT be 0
  # TODO(vavolkl): fix flaky test
  echo "Dynamic value"
  echo "   2 unique values in absolute"
  [ "$count_dynamic_absolute" -eq "2" ] || echo "Warning! count_dynamic_absolute not equal 2"
  echo "   delta value must NOT be 0"
  [ "$check_delta_dynamic" -eq "0" ] && echo "Warning! check_delta_dynamic equal to zero"

  # Additional validation for default behavior (delta sending enabled)
  echo "Default behavior validation"
  echo "   _absolute suffix present in metric names?"
  local absolute_suffix_count=$(grep $CVMFS_TEST_098_TMPFILE -e "_absolute,repo=" | wc -l)
  [ "$absolute_suffix_count" -gt "0" ] || return 13

  echo "   _delta metrics present?"
  local delta_metrics_count=$(grep $CVMFS_TEST_098_TMPFILE -e "_delta,repo=" | wc -l)
  [ "$delta_metrics_count" -gt "0" ] || return 14

  echo "   ... Success"
}

check_no_delta_sending() {
  echo "Check that delta sending can be disabled"

  echo "   Mount $TEST098_REPO with CVMFS_INFLUX_SEND_DELTA=OFF"
  test098_mount $TEST098_REPO "CVMFS_TELEMETRY_SEND=ON
CVMFS_TELEMETRY_RATE=5
CVMFS_INFLUX_HOST=localhost
CVMFS_INFLUX_PORT=8093
CVMFS_INFLUX_METRIC_NAME=cvmfs_client_counters
CVMFS_INFLUX_SEND_DELTA=OFF"

  echo "   UDP Listener: wait for 1 package from $TEST098_REPO"
  $CVMFS_SYS_PYTHON $CVMFS_TEST_098_PYTHON_SCRIPT -d localhost -p 8093 -m 1 -i lhcb > ${CVMFS_TEST_098_TMPFILE}.nodelta

  echo "   Do something to change counters"
  cat /cvmfs/$TEST098_REPO/*.sh > /dev/null

  echo "   UDP Listener: Wait for another package from $TEST098_REPO"
  $CVMFS_SYS_PYTHON $CVMFS_TEST_098_PYTHON_SCRIPT -d localhost -p 8093 -m 1 -i lhcb >> ${CVMFS_TEST_098_TMPFILE}.nodelta

  echo "   Umount $TEST098_REPO"
  test098_unmount $TEST098_REPO

  # do comparison
  echo "   Check output in file ${CVMFS_TEST_098_TMPFILE}.nodelta"
  local found=$(grep ${CVMFS_TEST_098_TMPFILE}.nodelta -e "catalog_revision" | wc -l)

  echo "      Right number of lines?"
  [ "$found" -eq "2" ] || return 20

  echo "      No _absolute suffix in metric names?"
  local absolute_count=$(grep ${CVMFS_TEST_098_TMPFILE}.nodelta -e "_absolute" | wc -l)
  [ "$absolute_count" -eq "0" ] || return 21

  echo "      No _delta metrics sent?"
  local delta_count=$(grep ${CVMFS_TEST_098_TMPFILE}.nodelta -e "_delta" | wc -l)
  [ "$delta_count" -eq "0" ] || return 22

  echo "      Base metric name used?"
  local base_metric_count=$(grep ${CVMFS_TEST_098_TMPFILE}.nodelta -e "cvmfs_client_counters,repo=" | wc -l)
  [ "$base_metric_count" -eq "2" ] || return 23

  echo "   ... Success"
}

cvmfs_run_test() {
  logfile=$1
  local_script_dir=$2
  trap cleanup HUP INT TERM EXIT || return $?

  echo "create temporary directory"
  CVMFS_TEST_098_TMPFILE=$(mktemp ./test098.log.XXXXXXXX)
  echo "tmpfile is $CVMFS_TEST_098_TMPFILE"


  CVMFS_TEST_098_PYTHON_SCRIPT=$local_script_dir/udp_listener.py

  check_counter_increase || return $?
  check_no_delta_sending || return $?

  return 0
}
