#!/bin/sh
#
# test suites (parallel disk i/o loads)
#

if [ -f platency.config ]; then
  . platency.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 "$test_filesize" ]; then
    test_filesize=50000000
fi
if [ -z "$test_num_process" ]; then
    test_num_process=20
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 "$do_realtime" ]; then
    do_realtime=yes
fi

if [ -z "$test_data_dir" ]; then
    echo '$test_data_dir is not set'
    exit 1
fi
echo "using pdisk test directory: $TESTDIR"
export TESTDIR=$test_data_dir

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

if [ ! -d "$output_dir" ]; then
  mkdir -p $output_dir
fi
sed -e "s/_label1_/$label1/g" < $test_root/tests/ptemplate.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

rm -f $output_dir/pcondition
echo "Test condition:" > $output_dir/pcondition
uname -a >> $output_dir/pcondition
echo "  CPU load = $cpu_load" >> $output_dir/pcondition
echo "  RTC freq = $rtc_freq" >> $output_dir/pcondition
echo "  RTC wakeup count = $rtc_count" >> $output_dir/pcondition
echo "  Deadline = $deadline" >> $output_dir/pcondition
echo "  Filesize = $test_filesize" >> $output_dir/pcondition
echo "  Processes = $test_num_process" >> $output_dir/pcondition
echo "  Forkbomb = $with_fork_test" >> $output_dir/condition
echo "  Realtime = $do_realtime" >> $output_dir/pcondition

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
echo "disk write stress ......................"
rm -f $output_dir/pdiskwrite.log
$LATTEST -p $output_dir/pdiskwrite.png -o $output_dir/pdiskwrite.out $measure_arg > $output_dir/pdiskwrite.log &
sh $test_root/stress/stress_diskwrite2 $test_num_process $test_filesize
killall measure 2>/dev/null
sleep 1
cat $output_dir/pdiskwrite.log
log_irq $output_dir/pdiskwrite.irq
sync
sleep 4

echo "disk copy stress ......................."
rm -f $output_dir/pdiskcopy.log
$LATTEST -p $output_dir/pdiskcopy.png -o $output_dir/pdiskcopy.out $measure_arg > $output_dir/pdiskcopy.log &
sh $test_root/stress/stress_diskcopy2 $test_num_process
killall measure 2>/dev/null
sleep 1
cat $output_dir/pdiskcopy.log
log_irq $output_dir/pdiskcopy.irq
sync
sleep 4

echo "disk read stress ......................."
rm -f $output_dir/pdiskread.log
$LATTEST -p $output_dir/pdiskread.png -o $output_dir/pdiskread.out $measure_arg > $output_dir/pdiskread.log &
sh $test_root/stress/stress_diskread2 $test_num_process
killall measure 2>/dev/null
sleep 1
cat $output_dir/pdiskread.log
log_irq $output_dir/pdiskread.irq

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

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
  killall measure 2>/dev/null
  sleep 1
  cat $output_dir/fork.log
  log_irq $output_dir/fork.irq
  sync
  sleep 4
fi
exit 0
