#!/bin/bash

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

set -e
# set -x

print_specific_help() {
cat << HLP
Specific options: 
       --dev path  use path as drive address. Default: /dev/cdrw
       --what path use path as address of the directory which shall
                   be copied into an ISO 9660 filesystem on media.
       --any_media allow non re-usable MMC media, like CD-R or DVD+R.
                   Allow paths to non-existing files, but disallow paths
                   to existing regular files.
Overview:
       Test burning to re-usable media CD-RW, DVD-RW, DVD-RAM, DVD+RW, BD-RE.
       By default, one-time usable media will be rejected deliberately.
HLP
}

getopts_inc=inc/releng_getopts.inc
if test -e "$getopts_inc"
then
  . "$getopts_inc"
  if test "$SPECIFIC_HELP" = 1
  then
       print_specific_help
       exit 0
  fi
else
  echo >&2
  echo "File not found: $getopts_inc" >&2
  echo "Are we in the ./releng directory of a libisoburn SVN checkout ?" >&2
  echo "(Please execute the tests from that ./releng directory.)" >&2
  echo >&2
  exit 29  
fi

# Set default values for specific option variables.
dev=/dev/cdrw
what=../xorriso
any_media=0
# Interpret specific options, they begin after the first --.
next_is=ignore
for i in "$@"
do
  if test "$next_is" = "ignore"
  then
       if test "$i" = "--"
       then
            next_is=""
       fi
  elif test "$next_is" = "dev"
  then
       dev="$i"
       next_is=""
  elif test "$next_is" = "what"
  then
       what="$i"
       next_is=""
  elif test "$i" = "--dev"
  then
       next_is="dev"
  elif test "$i" = "--what"
  then
       next_is="what"
  elif test "$i" = "--any_media"
  then
       any_media=1
  else
       echo >&2
       echo "Unknown test specific option: $i" >&2
       print_help
       print_specific_help
       exit 31
  fi
done


check_for_xorriso -x


# 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 30
else
 mkdir "${GEN_DATA_DIR}"
fi


#####################################################################

# Inspect drive address
if test -e "$dev"
then
  if test "$any_media" = 1 -a -f "$dev"
  then
    echo "FAIL : ${SELF} : --dev $dev leads to an existing regular file"
    echo
    cleanup
    exit 31
  fi
else
  if test "$any_media" = "0"
  then
    echo "FAIL : ${SELF} : --dev $dev does not lead to an existing file"
    echo
    cleanup
    exit 31
  fi
fi

# Inspect media
set +e
res=$("$RELENG_XORRISO" -outdev "$dev" 2>&1)
ret=$?
set -e
if test "$ret" -ne 0
then
  echo "$res" >&2
  echo "FAIL : ${SELF} : Non-zero exit value $ret with: $RELENG_XORRISO -outdev $dev"
  echo
  cleanup
  exit 1
elif echo "$res" | grep '^Media current:' >/dev/null 2>&1
then
  media=$(echo "$res" | grep '^Media current:' | \
          sed -e 's/^Media current: //')
  echo "Detected media: '$media'"
  if test "$media" = "CD-RW" -o "$media" = "DVD-RW sequential recording" -o \
          "$media" = "DVD-RW restricted overwrite" -o "$media" = "DVD-RAM" -o \
          "$media" = "DVD+RW" -o "$media" = "BD-RE"
  then
    echo "Recognized as re-usable."
  elif test "$media" = "is not recognizable"
  then
    echo "FAIL : ${SELF} : No recognizable media detected in: '$dev'"
    echo
    cleanup
    exit 2
  elif test "$any_media" = 1
  then
    echo "Accepted media only because of option --any_media : '$media'"
  else
    echo "FAIL : ${SELF} : No re-usable media detected, but: '$media'"
    echo
    cleanup
    exit 2
  fi
fi

# Perform burn run
echo "$RELENG_XORRISO" -for_backup -outdev "$dev" -blank as_needed -map "$what" /test
set +e
"$RELENG_XORRISO" \
    -for_backup \
    -outdev "$dev" \
    -blank as_needed \
    -map "$what" /test
ret=$?
set -e
if test "$ret" -ne 0
then
  echo "FAIL : ${SELF} : Non-zero exit value with burn run: $ret"
  echo
  cleanup
  exit 1
fi

if test "$SIMULATE_FAILURE" = 1
then
  echo "FAIL : ${SELF} : Simulated failure caused by option -f" 
  if test -f "$dev"
  then
    # Alter image 
    dd if=/dev/urandom bs=2K count=1 \
       of="$dev" conv=notrunc seek=400
  else
    cleanup
    exit 1
  fi
fi

# Check read
echo "$RELENG_XORRISO" -for_backup -indev "$dev" \
     -check_media event=FATAL -- \ -check_md5_r FATAL / --
set +e
"$RELENG_XORRISO" \
    -for_backup \
    -indev "$dev" \
    -print '---check_media:'  -check_media event=FATAL -- \
    -print '---check_md5_r:'  -check_md5_r FATAL / -- \
    -print '---compare_r:'    -md5 off -compare_r "$what" /test
ret=$?
set -e
if test "$ret" -ne 0
then
  echo "FAIL : ${SELF} : Non-zero exit value with checkread run: $ret"
  echo
  cleanup
  exit 1
fi

echo "Ok. Burn test passed."
echo
cleanup
exit 0