##
## @test @(#)test6941923.sh
## @bug 6941923 
## @summary test new added flags for gc log rotation 
## @author yqi 
## @run shell test6941923.sh
##
## some tests require path to find test source dir
if [ "${TESTSRC}" = "" ]
then
  TESTSRC=${PWD}
  echo "TESTSRC not set.  Using "${TESTSRC}" as default"
fi
echo "TESTSRC=${TESTSRC}"
## Adding common setup Variables for running shell tests.
. ${TESTSRC}/../../test_env.sh

## skip on windows
OS=`uname -s`
case "$OS" in
  Windows_* | CYGWIN_* )
    echo "Test skipped for Windows"
    exit 0 
    ;;
esac

# create a small test case
testname="Test"
if [ -e ${testname}.java ]; then
  rm -rf ${testname}.*
fi

cat >> ${testname}.java << __EOF__
import java.util.Vector;

public class Test implements Runnable
{
  private boolean _should_stop = false;

  public static void main(String[] args) throws Exception {

    long limit = Long.parseLong(args[0]) * 60L * 1000L;   // minutes
    Test t = new Test();
    t.set_stop(false);
    Thread thr = new Thread(t);
    thr.start();

    long time1 = System.currentTimeMillis();
    long time2 = System.currentTimeMillis();
    while (time2 - time1 < limit) {
      try {
        Thread.sleep(2000); // 2 seconds
      }
      catch(Exception e) {}
      time2 = System.currentTimeMillis();
      System.out.print("\r... " + (time2 - time1)/1000 + " seconds");
    }
    System.out.println();
    t.set_stop(true);
  }
  public void set_stop(boolean value) { _should_stop = value; }
  public void run() {
    int cap = 20000;
    int fix_size = 2048;
    int loop = 0;
    Vector< byte[] > v = new Vector< byte[] >(cap);
    while(!_should_stop) {
      byte[] g = new byte[fix_size];
      v.add(g);
      loop++;
      if (loop > cap) {
         v = null;
         cap *= 2;
         if (cap > 80000) cap = 80000;
         v = new Vector< byte[] >(cap);
      }
    }
  }
}
__EOF__

msgsuccess="succeeded"
msgfail="failed"
gclogsize="16K"
filesize=$((16*1024))
${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} ${testname}.java > $NULL 2>&1

if [ $? != 0 ]; then
  echo "${COMPILEJAVA}/bin/javac ${testname}.java $fail"
  exit -1
fi

# test for 2 minutes, it will complete circulation of gc log rotation
tts=2
logfile="test.log"
hotspotlog="hotspot.log"

if [ -e $logfile  ]; then
  rm -rf $logfile
fi

#also delete $hotspotlog if it exists
if [ -f $hotspotlog ]; then 
  rm -rf $hotspotlog
fi

options="-Xloggc:$logfile -XX:+UseConcMarkSweepGC -XX:+PrintGC -XX:+PrintGCDetails -XX:+UseGCLogFileRotation  -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=$gclogsize"
echo "Test gc log rotation in same file, wait for $tts minutes ...."
${TESTJAVA}/bin/java $options $testname $tts
if [ $? != 0 ]; then
  echo "$msgfail"
  exit -1
fi

# rotation file will be $logfile.0 
if [ -f $logfile.0 ]; then
  outfilesize=`ls -l $logfile.0 | awk '{print $5 }'`
  if [ $((outfilesize)) -ge $((filesize)) ]; then
    echo $msgsuccess
  else
    echo $msgfail
  fi
else 
  echo $msgfail
  exit -1
fi

# delete log file 
rm -rf $logfile.0
if [ -f $hotspotlog ]; then
  rm -rf $hotspotlog
fi

#multiple log files
numoffiles=3
options="-Xloggc:$logfile -XX:+UseConcMarkSweepGC -XX:+PrintGC -XX:+PrintGCDetails -XX:+UseGCLogFileRotation  -XX:NumberOfGCLogFiles=$numoffiles -XX:GCLogFileSize=$gclogsize"
echo "Test gc log rotation in $numoffiles files, wait for $tts minutes ...."
${TESTJAVA}/bin/java $options $testname $tts
if [ $? != 0 ]; then
  echo "$msgfail"
  exit -1
fi

atleast=0    # at least size of numoffile-1 files >= $gclogsize
tk=0
while [ $(($tk)) -lt $(($numoffiles)) ]
do
  if [ -f $logfile.$tk ]; then
    outfilesize=`ls -l $logfile.$tk | awk '{ print $5 }'`
    if [ $(($outfilesize)) -ge $(($filesize)) ]; then
      atleast=$((atleast+1))
    fi
  fi
  tk=$((tk+1))
done

rm -rf $logfile.*
rm -rf $testname.*
rm -rf $hotspotlog

if [ $(($atleast)) -ge $(($numoffiles-1)) ]; then
  echo $msgsuccess
else
  echo $msgfail
  exit -1
fi
