#!/bin/bash

# Copyright 2011 George Danchev <danchev@spnet.net>
# Licensed under GNU GPL version 2 or later

set -e

not_in_releng_exit() {
  printf "\nPlease execute the tests from releng directory.\n\n"
  exit 1
}

# Include common bits
. inc/releng_getopts.inc || not_in_releng_exit

print_specific_help() {
cat << HLP
Specific options:
       none yet.
Overview:
       Test performance of print_size against various input tree.
       Optionally compare with genisoimage and mkisofs.
HLP
}

if test "$SPECIFIC_HELP" = 1; then
  print_specific_help
  exit 0
fi

# Each test should decide whether or not it needs
# a xorriso binary to test, since some do compilations only.
if [ ! -x $RELENG_XORRISO ]; then
 print_help
 printf "\n${SELF}: -x  absolute or relative path to binary to be run.\n\n"
 exit 31
fi

# check data dir, if any and after checking -x xorriso
if [ -d "${GEN_DATA_DIR}" ]; then
 printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
 printf "\n${SELF}: use '${SELF} -c' to remove.\n"
 exit 8
else
 mkdir "${GEN_DATA_DIR}"
fi

#
DIR_UPPER=32
FILE_UPPER=10

# All must be set at this point
# TODO: work out a smarter way to quickly generate different
# types of trees (long, deep, etc)
printf "\n${SELF}: Generating sample tree in ${GEN_DATA_DIR} :\n"
count=0
date

# Hopefully the for-loops are much faster than while-loops with arithmetics
# This needs 7/4*DIR_UPPER+FILE_UPPER (= 66) while-iterations
#
i1_list= 
i1=0
o1=$(expr ${DIR_UPPER} / 4)
while test $i1 -lt $o1
do
  i1_list="$i1_list $i1"
  i1=$(expr $i1 + 1)
done
i2_list= 
i2=0
o2=$(expr ${DIR_UPPER} / 2)
while test $i2 -lt $o2
do
  i2_list="$i2_list $i2"
  i2=$(expr $i2 + 1)
done
i3_list= 
i3=0
while test $i3 -lt ${DIR_UPPER}
do
  i3_list="$i3_list $i3"
  i3=$(expr $i3 + 1)
done
i_file_list= 
i_file=0
while test $i_file -lt ${FILE_UPPER}
do
  i_file_list="$i_file_list $i_file"
  i_file=$(expr $i_file + 1)
done
#
# plus 1/8*DIR_UPPER*DIR_UPPER*DIR_UPPER*FILE_UPPER (= 40960) for-iterations
#
for i1 in $i1_list
do
  for i2 in $i2_list
  do
    for i3 in $i3_list
    do
      mkdir -p ${GEN_DATA_DIR}/DirOne$i1/DirTwo$i2/DirThree$i3
      for i_file in $i_file_list
      do
        echo -n \
             > ${GEN_DATA_DIR}/DirOne$i1/DirTwo$i2/DirThree$i3/File_${i_file}
        count=$((count + 1))
      done
    done
  done
  echo "  ${count} files created ..."
done

printf "done.\n"
date
du -s "${GEN_DATA_DIR}"

printf "\n${SELF}: Performing several print size runs to neutralize possible disk cache impact.\n"

# run xorriso
if [ -x ${RELENG_XORRISO} ]; then
  for run in 1 2 3; do
      printf "\n${SELF}: Running ${RELENG_XORRISO} -as mkisofs -quiet -print-size ${GEN_DATA_DIR}. Trial: ${run}.\n"
      time ${RELENG_XORRISO} -as mkisofs -quiet -print-size ${GEN_DATA_DIR}
  done
fi

# try to run genisoimage
if which genisoimage >/dev/null 2>&1; then
  RELENG_GENISOIMAGE=`which genisoimage`
  for run in 1 2 3; do
      printf "\n${SELF}: Running ${RELENG_GENISOIMAGE} -quiet -print-size ${GEN_DATA_DIR}. Trial: ${run}.\n"
      time ${RELENG_GENISOIMAGE}         -quiet -print-size ${GEN_DATA_DIR}
  done
fi

# try to run mkisofs
if which mkisofs >/dev/null 2>&1; then
  RELENG_MKISOFS=`which mkisofs`
  for run in 1 2 3; do
      printf "\n${SELF}: Running ${RELENG_MKISOFS} -quiet -print-size ${GEN_DATA_DIR}. Trial: ${run}.\n"
      time ${RELENG_MKISOFS}             -quiet -print-size ${GEN_DATA_DIR}
  done
fi

#
cleanup

#
exit 0