#!/bin/bash
# This file contains $NR_OF_TESTS tests for checking the print publish statistics feature
cvmfs_test_name="Print publish statistics"
cvmfs_test_autofs_on_startup=false
cvmfs_test_suites="quick"

CVMFS_TEST_659_NR_OF_TESTS=4
CVMFS_TEST_659_ERROR_FILES_ADDED=101
CVMFS_TEST_659_ERROR_FILES_REMOVED=102
CVMFS_TEST_659_ERROR_FILES_CHANGED=103
CVMFS_TEST_659_ERROR_FILES_DUPLICATED=104
CVMFS_TEST_659_ERROR_DIRS_ADDED=105
CVMFS_TEST_659_ERROR_DIRS_REMOVED=106
CVMFS_TEST_659_ERROR_DIRS_CHANGED=107
CVMFS_TEST_659_ERROR_BYTES_ADDED=108
CVMFS_TEST_659_ERROR_BYTES_REMOVED=109
CVMFS_TEST_659_ERROR_BYTES_UPLOADED=110
CVMFS_TEST_659_TAR_FILE=tarfile.tar
CVMFS_TEST_659_TAR_DIR=newTarDir
CVMFS_TEST_659_REPO=

test1() {
  local working_dir=$1

  pushdir $working_dir

  echo "meaningless file content" > file1    # 1 file added ; 25 bytes added
  echo "more clever file content" > file2    # 1 file added ; 25 bytes added
  echo "" > file3                            # 1 file added ; 1 byte added ['\n']
  mkdir foo                                  # 1 directory added
  mkdir bar                                  # 1 directory added
  touch ./foo/file4                          # 1 file added ; 0 byte added
  echo "123 - testing" > ./foo/file5         # 1 file added ; 14 byte added

  popdir
}

test2() {
  local working_dir=$1

  pushdir $working_dir

  echo "additional meaningless content" >> file1   # 1 file changed ; 31 bytes added
  echo "new file content" > file2                  # 1 file changed ; (25 -17 = 8 bytes removed
  touch bar                                        # 1 directory changed
  rm -rf foo               # 1 directory removed ; 2 files removed ; 14 bytes removed

  popdir
}

#ingest command test
test3() {
  local working_dir=$1

  pushdir $working_dir

  echo "*** Create files in $working_dir..."
  test1 $working_dir
  echo "*** Making tar file..."
  tar -cvf $CVMFS_TEST_659_TAR_FILE  * || return $?
  echo "*** Tar file created."
  popdir
}

cleanup() {
  if [ "x$CVMFS_TEST_659_REPO" != "x" ]; then
    destroy_repo $CVMFS_TEST_659_REPO
  fi
}

cvmfs_run_test() {
  logfile=$1
  # We need a fresh name in order to start with an empty S3 space
  local repo_name=test-659.cern.ch
  local repo_dir=/cvmfs/$repo_name
  local scratch_dir=$(pwd)
  local tar_file_path=$scratch_dir/tmp_dir/$CVMFS_TEST_659_TAR_FILE

  echo "*** Create a fresh repository named $repo_name with user $CVMFS_TEST_USER and CVMFS_PRINT_STATISTICS=true"
  create_empty_repo $repo_name $CVMFS_TEST_USER || return $?
  CVMFS_TEST_659_REPO=$repo_name
  trap cleanup EXIT HUP INT TERM
  sudo bash -c "echo CVMFS_PRINT_STATISTICS=true >> /etc/cvmfs/repositories.d/$repo_name/server.conf"

  # ============================ Test1 =============================

  echo "*** starting transaction to edit repository"
  start_transaction $repo_name || return $?

  echo "*** Test 1 - putting some stuff in the new repository"
  test1 $repo_dir || return 1

  echo "*** creating CVMFS snapshot"
  publish_repo $repo_name > test_659_1 || return $?

  # ============================ Test2 =============================

  echo "*** init a new transaction to change something in repository $repo_name"
  start_transaction $repo_name || return $?

  echo "*** Test 2 - change stuff in the repository"
  test2 $repo_dir || return 2

  echo "*** creating CVMFS snapshot"
  publish_repo $repo_name > test_659_2 || return $?

  # ============================ Test3 =============================

  echo "*** Test 3 - making a tar and execute ingest command"
  mkdir tmp_dir
  test3 $scratch_dir/tmp_dir || return 3
  cvmfs_server ingest -t $tar_file_path -b $CVMFS_TEST_659_TAR_DIR $repo_name > test_659_3 || return $?

  # ============================ Test4 =============================

  echo "*** Test 4 - overwrite the tar file"
  cvmfs_server ingest -t $tar_file_path -b $CVMFS_TEST_659_TAR_DIR $repo_name > test_659_4 || return $?

  # =========================================================================================================

  echo "*** check catalog and data integrity"
  check_repository $repo_name -i || return $?

  # Reference test values
  declare -A test_results
  # test 1
  test_results[1,1]=5     # n_files_added
  test_results[1,2]=0     # n_files_removed
  test_results[1,3]=0     # n_files_changed
  test_results[1,4]=5     # n_chunks_added
  test_results[1,5]=0     # n_chunks_duplicated
  test_results[1,6]=1     # n_catalogs_added
  test_results[1,7]=2     # n_directories_added
  test_results[1,8]=0     # n_directories_removed
  test_results[1,9]=0     # n_directories_changed
  test_results[1,10]=0     # n_symlinks_added
  test_results[1,11]=0     # n_symlinks_removed
  test_results[1,12]=0     # n_symlinks_changed
  test_results[1,13]=65    # sz_added_bytes
  test_results[1,14]=0     # sz_removed_bytes
  test_results[1,15]=103  # sz_uploaded_bytes
  # test 2
  test_results[2,1]=0
  test_results[2,2]=2
  test_results[2,3]=2
  test_results[2,4]=2
  test_results[2,5]=0
  test_results[2,6]=1
  test_results[2,7]=0
  test_results[2,8]=1
  test_results[2,9]=1
  test_results[2,10]=0
  test_results[2,11]=0
  test_results[2,12]=0
  test_results[2,13]=31
  test_results[2,14]=22
  test_results[2,15]=74
  # test 3
  test_results[3,1]=5
  test_results[3,2]=0
  test_results[3,3]=0
  test_results[3,4]=0
  test_results[3,5]=5
  test_results[3,6]=1
  test_results[3,7]=3
  test_results[3,8]=0
  test_results[3,9]=0
  test_results[3,10]=0
  test_results[3,11]=0
  test_results[3,12]=0
  test_results[3,13]=65
  test_results[3,14]=0
  test_results[3,15]=0
  # test 4
  test_results[4,1]=0
  test_results[4,2]=0
  test_results[4,3]=5
  test_results[4,4]=0
  test_results[4,5]=5
  test_results[4,6]=1
  test_results[4,7]=0
  test_results[4,8]=0
  test_results[4,9]=0
  test_results[4,10]=0
  test_results[4,11]=0
  test_results[4,12]=0
  test_results[4,13]=0
  test_results[4,14]=0
  test_results[4,15]=0

  # check publish statistics
  for i in `seq 1 $CVMFS_TEST_659_NR_OF_TESTS`;
  do
    local files_added=$(cat test_659_$i | grep n_files_added |cut -d '|' -f 2)
    local files_removed=$(cat test_659_$i |  grep n_files_removed |cut -d '|' -f 2)
    local files_changed=$(cat test_659_$i |  grep n_files_changed |cut -d '|' -f 2)
    local chunks_added=$(cat test_659_$i |  grep n_chunks_added |cut -d '|' -f 2)
    local chunks_duplicated=$(cat test_659_$i |  grep n_chunks_duplicated |cut -d '|' -f 2)
    local catalogs_added=$(cat test_659_$i |  grep n_catalogs_added |cut -d '|' -f 2)
    local directories_added=$(cat test_659_$i | grep n_directories_added |cut -d '|' -f 2)
    local directories_removed=$(cat test_659_$i |  grep n_directories_removed |cut -d '|' -f 2)
    local directories_changed=$(cat test_659_$i |  grep n_directories_changed |cut -d '|' -f 2)
    local symlinks_added=$(cat test_659_$i |  grep n_symlinks_added |cut -d '|' -f 2)
    local symlinks_removed=$(cat test_659_$i |  grep n_symlinks_removed |cut -d '|' -f 2)
    local symlinks_changed=$(cat test_659_$i |  grep n_symlinks_changed |cut -d '|' -f 2)
    local bytes_added=$(cat test_659_$i |  grep sz_added_bytes |cut -d '|' -f 2)
    local bytes_removed=$(cat test_659_$i |  grep sz_removed_bytes |cut -d '|' -f 2)
    local bytes_uploaded=$(cat test_659_$i |  grep sz_uploaded_bytes |cut -d '|' -f 2)

    if [ "x$files_added" != "x${test_results[$i,1]}" ]; then
      echo "*** Test $i.1 - number of added files - \
            ($files_added vs ref:${test_results[$i,1]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_FILES_ADDED
    fi
    if [ "x$files_removed" != "x${test_results[$i,2]}" ]; then
      echo "*** Test $i.2 - number of removed files -\
           ($files_removed vs ref:${test_results[$i,2]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_FILES_REMOVED
    fi
    if [ "x$files_changed" != "x${test_results[$i,3]}" ]; then
      echo "*** Test $i.3 - number of changed files - \
            ($files_changed vs ref:${test_results[$i,3]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_FILES_CHANGED
    fi
    if [ "x$chunks_added" != "x${test_results[$i,4]}" ]; then
      echo "*** Test $i.4 - number of added chunks - \
            ($chunks_added vs ref:${test_results[$i,4]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_CHUNKS_ADDED
    fi
    if [ "x$chunks_duplicated" != "x${test_results[$i,5]}" ]; then
      echo "*** Test $i.5 - number of duplicated chunks - \
            ($chunks_duplicated vs ref:${test_results[$i,5]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_CHUNKS_DUPLICATED
    fi
    if [ "x$catalogs_added" != "x${test_results[$i,6]}" ]; then
      echo "*** Test $i.6 - number of added catalogs - \
            ($catalogs_added vs ref:${test_results[$i,6]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_CATALOGS_ADDED
    fi
    if [ "x$directories_added" != "x${test_results[$i,7]}" ]; then
      echo "*** Test $i.7 - number of added directories - \
            ($directories_added vs ref:${test_results[$i,7]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_DIRS_ADDED
    fi
    if [ "x$directories_removed" != "x${test_results[$i,8]}" ]; then
      echo "*** Test $i.8 - number of removed directories \
            - ($directories_removed vs ref:${test_results[$i,8]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_DIRS_REMOVED
    fi
    if [ "x$directories_changed" != "x${test_results[$i,9]}" ]; then
      echo "*** Test $i.9 - number of changed directories - \
            ($directories_changed vs ref:${test_results[$i,9]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_DIRS_CHANGED
    fi
    if [ "x$symlinks_added" != "x${test_results[$i,10]}" ]; then
      echo "*** Test $i.10 - number of added symlinks - \
            ($symlinks_added vs ref:${test_results[$i,10]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_SYMLINKS_ADDED
    fi
    if [ "x$symlinks_removed" != "x${test_results[$i,11]}" ]; then
      echo "*** Test $i.11 - number of removed symlinks \
            - ($symlinks_removed vs ref:${test_results[$i,11]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_SYMLINKS_REMOVED
    fi
    if [ "x$symlinks_changed" != "x${test_results[$i,12]}" ]; then
      echo "*** Test $i.12 - number of changed symlinks - \
            ($symlinks_changed vs ref:${test_results[$i,12]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_SYMLINKS_CHANGED
    fi
    if [ "x$bytes_added" != "x${test_results[$i,13]}" ]; then
      echo "*** Test $i.13 - number of added bytes - \
            ($bytes_added vs ref:${test_results[$i,13]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_BYTES_ADDED
    fi
    if [ "x$bytes_removed" != "x${test_results[$i,14]}" ]; then
      echo "*** Test $i.14 - number of removed bytes - \
            ($bytes_removed vs ref:${test_results[$i,14]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_BYTES_REMOVED
    fi
    if [ "x$bytes_uploaded" != "x${test_results[$i,15]}" ]; then
      echo "*** Test $i.15 - number of uploaded bytes - \
            ($bytes_uploaded vs ref:${test_results[$i,15]}) FAILED!"
      return $CVMFS_TEST_659_ERROR_BYTES_UPLOADED
    fi

    # clean
    rm test_659_$i
  done

  return 0
}

