#!/bin/sh
#
# test suites
#

if [ -f latency.config ]; then
  . latency.config
fi

if [ -z "$test_root" ]; then
    echo '$test_root is not set'
    exit 1
fi
    
LATTEST=$test_root/bin/measure
echo "using test program: $LATTEST"

if [ -z "$cpu_load" ]; then
    cpu_load=0
fi
if [ -z "$rtc_freq" ]; then
    rtc_freq=1024
fi
if [ -z "$rtc_count" ]; then
    rtc_count=2
fi
if [ -z "$deadline" ]; then
    deadline=2
fi
if [ -z "$with_x_test" ]; then
    with_x_test=yes
fi
if [ -z "$with_proc_test" ]; then
    with_proc_test=yes
fi
if [ -z "$with_disk_test" ]; then
    with_disk_test=yes
fi
if [ -z "$test_filesize" ]; then
    test_filesize=1000000000
fi
if [ -z "$output_dir" ]; then
    output_dir=.
fi
if [ -z "$with_fork_test" ]; then
    with_fork_test=no
fi
if [ -z "$fork_num_process" ]; then
    fork_num_process=5000
fi
if [ -z "$fork_loop_size" ]; then
    fork_loop_size=1000000
fi
if [ -z "$fork_mem" ]; then
    fork_mem=0
fi
if [ -z "$do_realtime" ]; then
    do_realtime=yes
fi
if [ -z "$use_rtc" ]; then
    use_rtc=no
fi

if [ "$with_disk_test" != no -o "$with_fils_test" != no ]; then
  if [ -z "$test_data_dir" ]; then
      echo '$test_data_dir is not set'
      exit 1
  fi
  echo "using disk test directory: $TESTDIR"
  export TESTDIR=$test_data_dir
fi

label1="(freq $freq - count $count)"

if [ ! -d "$output_dir" ]; then
  mkdir -p $output_dir
fi
sed -e "s/_label1_/$label1/g" < $test_root/tests/template.html > $output_dir/index.html

measure_arg="-c $cpu_load -f $rtc_freq -n $rtc_count -t $deadline"
if [ "$do_realtime" = "no" ]; then
  measure_arg="$measure_arg -u"
fi
if [ -n "$kernel_device" ]; then
  measure_arg="$measure_arg -D $kernel_device"
fi
if [ "$use_rtc" = "yes" ]; then
  measure_arg="$measure_arg -I"
fi

rm -f $output_dir/condition
echo "Test condition:" > $output_dir/condition
uname -a >>  $output_dir/condition
echo "  CPU load = $cpu_load" >> $output_dir/condition
echo "  RTC freq = $rtc_freq" >> $output_dir/condition
echo "  RTC wakeup count = $rtc_count" >> $output_dir/condition
echo "  Deadline = $deadline" >> $output_dir/condition
echo "  X-test = $with_x_test" >> $output_dir/condition
echo "  Proc-test = $with_proc_test" >> $output_dir/condition
echo "  Disk-test = $with_disk_test" >> $output_dir/condition
echo "  Filesize = $test_filesize" >> $output_dir/condition
echo "  Forkbomb = $with_fork_test" >> $output_dir/condition
echo "  Realtime = $do_realtime" >> $output_dir/condition
echo "  Use RTC = $use_rtc" >> $output_dir/condition

function log_irq () {
  if [ -f /proc/irq-log-hard ]; then
    echo "hard:" > $1
    cat /proc/irq-log-hard >> $1
    echo >> $1
    echo "soft:" >> $1
    cat /proc/irq-log-soft >> $1
    echo >> $1
    echo "timer:" >> $1
    cat /proc/irq-log-timer >> $1
  fi
}

log_irq /dev/null
if [ "$with_x_test" != no ]; then
  echo "x11 stress ......................."
  rm -f $output_dir/x11.log
  $LATTEST -p $output_dir/x11.png -o $output_dir/x11.out $measure_arg > $output_dir/x11.log &
  sh $test_root/stress/stress_x11
  killall measure 2>/dev/null
  sleep 1
  cat $output_dir/x11.log
  log_irq $output_dir/x11.irq
  sync
  sleep 4
fi

if [ "$with_proc_test" != no ]; then
  echo "proc filesystem stress (using top) ......................."
  rm -f $output_dir/proc.log
  $LATTEST -p $output_dir/proc.png -o $output_dir/proc.out $measure_arg > $output_dir/proc.log &
  sh $test_root/stress/stress_procfile
  killall measure 2>/dev/null
  sleep 1
  cat $output_dir/proc.log
  log_irq $output_dir/proc.irq
  sync
  sleep 4
fi

if [ "$with_disk_test" != no ]; then
  echo "disk write stress ......................"
  rm -f $output_dir/diskwrite.log
  $LATTEST -p $output_dir/diskwrite.png -o $output_dir/diskwrite.out $measure_arg > $output_dir/diskwrite.log &
  sh $test_root/stress/stress_diskwrite $test_filesize
  killall measure 2>/dev/null
  sleep 1
  cat $output_dir/diskwrite.log
  log_irq $output_dir/diskwrite.irq
  ls -la $TESTDIR/tmpfile*
  sync
  sleep 4

  echo "disk copy stress ......................."
  rm -f $output_dir/diskcopy.log
  $LATTEST -p $output_dir/diskcopy.png -o $output_dir/diskcopy.out $measure_arg > $output_dir/diskcopy.log &
  sh $test_root/stress/stress_diskcopy
  killall measure 2>/dev/null
  sleep 1
  cat $output_dir/diskcopy.log
  log_irq $output_dir/diskcopy.irq
  ls -la $TESTDIR/tmpfile*
  sync
  sleep 4

  echo "disk read stress ......................."
  rm -f $output_dir/diskread.log
  $LATTEST -p $output_dir/diskread.png -o $output_dir/diskread.out $measure_arg > $output_dir/diskread.log &
  sh $test_root/stress/stress_diskread
  killall measure 2>/dev/null
  sleep 1
  cat $output_dir/diskread.log
  log_irq $output_dir/diskread.irq
  ls -la $TESTDIR/tmpfile*

  rm -f $TESTDIR/tmpfile $TESTDIR/tmpfile2
fi

if [ "$with_fork_test" != no ]; then
   echo "fork stress ......................."
  rm -f $output_dir/fork.log
  $LATTEST -p $output_dir/fork.png -o $output_dir/fork.out $measure_arg > $output_dir/fork.log &
  sleep 2
  $test_root/stress/stress_fork $fork_num_process $fork_loop_size $fork_mem
  killall measure 2>/dev/null
  sleep 1
  cat $output_dir/fork.log
  log_irq $output_dir/fork.irq
  sync
  sleep 4
fi

if [ "$with_files_test" != no ]; then
   echo "file create/del stress ......................."
  rm -f $output_dir/files.log
  $LATTEST -p $output_dir/files.png -o $output_dir/files.out $measure_arg > $output_dir/files.log &
  sleep 2
  $test_root/stress/stress_files $TESTDIR
  killall measure 2>/dev/null
  sleep 1
  cat $output_dir/files.log
  log_irq $output_dir/files.irq
  sync
  sleep 4
fi

exit 0
