#!/usr/bin/env bash

######################################################################
# 7) prepare output of the results
# - this script pre-creates all needed logfiles for later summary
######################################################################

set -eu

# read our defined variables
cd /var/tmp
source env.txt

mkdir -p $RESPATH

TARNAME=qemu-$OS

# check if building the module has failed
if [ -z ${VMs:-} ]; then
  cd $RESPATH
  echo ":exclamation: ZFS module didn't build successfully :exclamation:" \
    | tee summary.txt | tee /tmp/summary.txt
  cp /var/tmp/*.txt .

  # rename /var/tmp/test_results to /var/tmp/qemu-$OS
  mv $RESPATH $(dirname $RESPATH)/$TARNAME
  tar cjf /tmp/$TARNAME.tar.bz2 -C $(dirname $RESPATH) -h $TARNAME || true
  # move it back to /var/tmp/test_results (needed for next script)
  mv $(dirname $RESPATH)/$TARNAME $RESPATH

  exit 0
fi

if ! grep -q vm /etc/hosts ; then
        echo "No vm* hostnames, VMs probably didn't startup"
        exit 0
fi

# build was okay
BASE="$HOME/work/zfs/zfs"
MERGE="$BASE/.github/workflows/scripts/merge_summary.awk"

# catch result files of testings (vm's should be there)
for ((i=1; i<=VMs; i++)); do
  rsync -arL zfs@vm$i:$RESPATH/current $RESPATH/vm$i || true
  scp zfs@vm$i:"/var/tmp/*.txt" $RESPATH/vm$i || true
  scp zfs@vm$i:"/var/tmp/*.rpm" $RESPATH/vm$i || true
done
cp -f /var/tmp/*.txt $RESPATH || true
cd $RESPATH

# prepare result files for summary
for ((i=1; i<=VMs; i++)); do

  # no results, VM either didn't start or was unreachable, create
  # the missing directory which is expected by subsequent steps
  test -d vm$i || mkdir -p vm$i

  file="vm$i/build-stderr.txt"
  test -s $file && mv -f $file build-stderr.txt

  file="vm$i/build-exitcode.txt"
  test -s $file && mv -f $file build-exitcode.txt

  file="vm$i/uname.txt"
  test -s $file && mv -f $file uname.txt

  file="vm$i/tests-exitcode.txt"
  if [ ! -s "$file" ]; then
    # Print in bold red
    echo -e "\033[1;31mVM$i didn't finish ZTS and may have crashed!\033[0m" >> extra

    # ENOENT=2
    echo 2 > "$file"
  fi
  rv=$(cat "$file")
  test $rv != 0 && touch /tmp/have_failed_tests

  file="vm$i/current/log"
  if [ -s $file ]; then
    cat $file >> log
    awk '/\[FAIL\]|\[KILLED\]/{ show=1; print; next; }; \
      /\[SKIP\]|\[PASS\]/{ show=0; } show' \
      $file > /tmp/vm${i}dbg.txt
  fi

  file="vm${i}log.txt"
  fileC="/tmp/vm${i}log.txt"
  if [ -s $file ]; then
    cat $file >> summary
    cat $file | $BASE/scripts/zfs-tests-color.sh > $fileC
  fi
done

# create summary of tests
if [ -s summary ]; then
  $MERGE summary | grep -v '^/' > summary.txt
  $MERGE summary | $BASE/scripts/zfs-tests-color.sh > /tmp/summary.txt

  # Add in additional 'extra' text at the end, if file is present.
  if [ -s extra ] ; then
    echo "" >> /tmp/summary.txt
    cat extra >> /tmp/summary.txt
    rm -f extra
  fi

  rm -f summary
else
  touch summary.txt /tmp/summary.txt
fi

# create file for debugging
if [ -s log ]; then
  awk '/\[FAIL\]|\[KILLED\]/{ show=1; print; next; }; \
    /\[SKIP\]|\[PASS\]/{ show=0; } show' \
    log > summary-failure-logs.txt
  rm -f log
else
  touch summary-failure-logs.txt
fi

# create debug overview for failed tests
cat summary.txt \
  | awk '/\(expected PASS\)/{ if ($1!="SKIP") print $2; next; } show' \
  | while read t; do
  cat summary-failure-logs.txt \
    | awk '$0~/Test[: ]/{ show=0; } $0~v{ show=1; } show' v="$t" \
    > /tmp/fail.txt
  SIZE=$(stat --printf="%s" /tmp/fail.txt)
  SIZE=$((SIZE/1024))
  # Test Summary:
  echo "##[group]$t ($SIZE KiB)" >> /tmp/failed.txt
  cat /tmp/fail.txt | $BASE/scripts/zfs-tests-color.sh >> /tmp/failed.txt
  echo "##[endgroup]" >> /tmp/failed.txt
  # Job Summary:
  echo -e "\n<details>\n<summary>$t ($SIZE KiB)</summary><pre>" >> failed.txt
  cat /tmp/fail.txt >> failed.txt
  echo "</pre></details>" >> failed.txt
done

if [ -e /tmp/have_failed_tests ]; then
  echo ":warning: Some tests failed!" >> failed.txt
else
  echo ":thumbsup: All tests passed." >> failed.txt
fi

if [ ! -s uname.txt ]; then
  echo ":interrobang: Panic - where is my uname.txt?" > uname.txt
fi

# artifact ready now
#
# rename /var/tmp/test_results to /var/tmp/qemu-$OS
mv $RESPATH $(dirname $RESPATH)/$TARNAME
tar cjf /tmp/$TARNAME.tar.bz2 -C $(dirname $RESPATH) -h $TARNAME || true
# move it back to /var/tmp/test_results (needed for next script)
mv $(dirname $RESPATH)/$TARNAME $RESPATH
