# This file is part of the sos project: https://github.com/sosreport/sos
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions of
# version 2 of the GNU General Public License.
#
# See the LICENSE file in the source distribution for further information.
#/bin/bash
# A quick port of the travis tests to bash, requires root
# TODO
# * look into using a framework..
# * why --dry-run fails?
# * why --experimental fails?
# * make it better validate archives and contents

PYTHON=${1:-/usr/bin/python3}
SOSPATH=${2:-./bin/sos report}

NUMOFFAILURES=0
summary="Summary\n"

run_expecting_sucess () {
    #$1 - is command options
    #$2 - kind of check to do, so far only extract
    FAIL=false
    # Make sure clean
    rm -f /dev/shm/stderr /dev/shm/stdout /tmp/sosreport*.tar.*
    rm -rf /tmp/sosreport_test/

    start=$(date +%s)
    echo "######### RUNNING $1 #########"
    $PYTHON $SOSPATH $1 2> /dev/shm/stderr 1> /dev/shm/stdout

    if [ $? -eq 0 ]; then
      echo "### Success"
    else
      echo "!!! FAILED !!! (return value)"
      FAIL=true
    fi

    end=$(date +%s)
    runtime=$((end-start))
    echo "#### Sos Total time (seconds):" $runtime

    if [ -s /dev/shm/stderr ]; then
        # do not set this to true by default: during CI, /boot and other
        # directories might not be mounted (e.g. kernel modules), this
        # leads to false positives.
        # FAIL=true
        echo "!!! FAILED !!! (stderr)"
        echo "### start stderr"
        cat /dev/shm/stderr
        echo "### end stderr"
    fi

    echo "### start stdout"
    cat /dev/shm/stdout
    echo "### end stdout"

    if [ "extract" = "$2" ]; then
        rm -f /tmp/sosreport*md5
        mkdir /tmp/sosreport_test/
        tar_file=$(find /tmp/ -maxdepth 1 -type f \( -name "sosreport*.tar.xz" -o -name "sosreport*.tar.gz" \) -print -quit)
        if [ -n "${tar_file}" ]; then
            echo "### start extraction of ${tar_file}"
            tar xfa "${tar_file}" -C /tmp/sosreport_test --strip-components=1
            errors=$(find /tmp/sosreport_test/sos_logs/ -maxdepth 1 -type f -name "*errors.txt" -print -quit)
            if [ -n "${errors}" ]; then
                echo "#### errors found in ${errors}"
                FAIL=true
                echo "!!! FAILED !!! (${errors})"
                echo "#### *errors.txt output"
                ls -alh /tmp/sosreport_test/sos_logs/
                cat /tmp/sosreport_test/sos_logs/*errors.txt
            fi
            echo "### stop extraction of ${tar_file}"
        else
            # Cannot set to FAILED here since at least some test is
            # informational
            echo "#### No archive found"
        fi
    fi

    size="$(grep Size /dev/shm/stdout)"
    summary="${summary} \n failures ${FAIL} \t time ${runtime} \t ${size} \t ${1} "

    echo "######### DONE WITH $1 #########"

    if $FAIL; then
      NUMOFFAILURES=$((NUMOFFAILURES + 1))
      return 1
    else
      return 0
    fi
}

# If /etc/sos/sos.conf doesn't exist let's just make it..
if [ -f /etc/sos/sos.conf ]; then
   echo "/etc/sos/sos.conf already exists"
else
   echo "Creating /etc/sos.conf"
   mkdir /etc/sos
   touch /etc/sos/sos.conf
fi

# Runs not generating sosreports
run_expecting_sucess " -l"
run_expecting_sucess " --list-presets"
run_expecting_sucess " --list-profiles"

# Test generating sosreports, 3 (new) options at a time
# Trying to do --batch   (1 label/archive/report/verbosity change)   (other changes)
run_expecting_sucess " --batch   --build   --no-env-vars "  # Only --build test
run_expecting_sucess " --batch   --no-report   -o hardware " extract
run_expecting_sucess " --batch   --label TEST   -a  -c never" extract
run_expecting_sucess " --batch   --debug  --log-size 0  -c always" extract
run_expecting_sucess " --batch   -z xz   --log-size 1" extract
run_expecting_sucess " --batch   -z gzip" extract
run_expecting_sucess " --batch   -t 1 -n hardware" extract
run_expecting_sucess " --batch   --quiet    -e opencl -k kernel.with-timer" extract
run_expecting_sucess " --batch   --case-id 10101   --all-logs --since=$(date -d "yesterday 13:00" '+%Y%m%d') " extract
run_expecting_sucess " --batch   --verbose   --no-postproc" extract
run_expecting_sucess " --batch   --mask" extract

echo $summary

if [ $NUMOFFAILURES -gt 0 ]; then
  echo "FAILED $NUMOFFAILURES"
  exit 1
else
  echo "Everything worked!"
  exit 0
fi

# vim: set et ts=4 sw=4 :
