#!/bin/ksh
# 
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is the Netscape Portable Runtime (NSPR).
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1999-2000
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****

#
# runy2ktests.ksh
#	Set system clock to Y2K dates of interest and run the Y2K tests.
#	Needs root/administrator privilege
#
# WARNING: Because this script needs to be run with root/administrator
#	privilege, thorough understanding of the script and extreme
#	caution are urged.
#

#
# SECTION I
#	Define variables
#

SYSTEM_INFO=`uname -a`
OS_ARCH=`uname -s`
if [ $OS_ARCH = "Windows_NT" ] || [ $OS_ARCH = "Windows_95" ]
then
	NULL_DEVICE=nul
else
	NULL_DEVICE=/dev/null
fi

#
# Test dates for NSPR Y2K tests
#
Y2KDATES="	123123591998.55
			090923591999.55
			123123591999.55
			022823592000.55
			022923592000.55
			123123592000.55"

Y2KDATES_AIX="	12312359.5598
				09092359.5599
				12312359.5599
				02282359.5500
				02292359.5500
				12312359.5500"

Y2KDATES_HPUX="	123123591998
				090923591999
				123123591999
				022823592000
				022923592000
				123123592000"

Y2KDATES_MKS="	1231235998.55
				0909235999.55
				1231235999.55
				0228235900.55
				0229235900.55
				1231235900.55"

#
# NSPR Y2K tests
#
Y2KTESTS="
y2k		\n
y2ktmo	\n
y2k		\n
../runtests.ksh"

Y2KTESTS_HPUX="
y2k			\n
y2ktmo -l 60\n
y2k			\n
../runtests.ksh"

#
# SECTION II
#	Define functions
#

save_date()
{
	case $OS_ARCH in
	AIX)
		SAVED_DATE=`date "+%m%d%H%M.%S%y"`
	;;
	HP-UX)
		SAVED_DATE=`date "+%m%d%H%M%Y"`
	;;
	Windows_NT)
		SAVED_DATE=`date "+%m%d%H%M%y.%S"`
	;;
	Windows_95)
		SAVED_DATE=`date "+%m%d%H%M%y.%S"`
	;;
	*)
		SAVED_DATE=`date "+%m%d%H%M%Y.%S"`
	;;
	esac
}

set_date()
{
	case $OS_ARCH in
	Windows_NT)
#
# The date command in MKS Toolkit releases 5.1 and 5.2
# uses the current DST status for the date we want to
# set the system clock to.  However, the DST status for
# that date may be different from the current DST status.
# We can work around this problem by invoking the date
# command with the same date twice.
#
		date "$1" > $NULL_DEVICE
		date "$1" > $NULL_DEVICE
	;;
	*)
		date "$1" > $NULL_DEVICE
	;;
	esac
}

restore_date()
{
	set_date "$SAVED_DATE"
}

savedate()
{
	case $OS_ARCH in
	AIX)
		SAVED_DATE=`date "+%m%d%H%M.%S%y"`
	;;
	HP-UX)
		SAVED_DATE=`date "+%m%d%H%M%Y"`
	;;
	Windows_NT)
		SAVED_DATE=`date "+%m%d%H%M%y.%S"`
	;;
	Windows_95)
		SAVED_DATE=`date "+%m%d%H%M%y.%S"`
	;;
	*)
		SAVED_DATE=`date "+%m%d%H%M%Y.%S"`
	;;
	esac
}

set_y2k_test_parameters()
{
#
# set dates
#
	case $OS_ARCH in
	AIX)
		DATES=$Y2KDATES_AIX
	;;
	HP-UX)
		DATES=$Y2KDATES_HPUX
	;;
	Windows_NT)
		DATES=$Y2KDATES_MKS
	;;
	Windows_95)
		DATES=$Y2KDATES_MKS
	;;
	*)
		DATES=$Y2KDATES
	;;
	esac

#
# set tests
#
	case $OS_ARCH in
	HP-UX)
		TESTS=$Y2KTESTS_HPUX
	;;
	*)
		TESTS=$Y2KTESTS
	;;
	esac
}

#
# runtests:
#	-	runs each test in $TESTS after setting the
#		system clock to each date in $DATES
#

runtests()
{
for newdate in ${DATES}
do
	set_date $newdate
	echo $newdate
	echo "BEGIN\t\t\t`date`"
	echo "Date\t\t\t\t\tTest\t\t\tResult"
	echo $TESTS | while read prog
	do
		echo "`date`\t\t\c"
		echo "$prog\c"
		./$prog >> ${LOGFILE} 2>&1
		if [ 0 = $? ] ; then
			echo "\t\t\tPassed";
		else
			echo "\t\t\tFAILED";
		fi;
	done
	echo "END\t\t\t`date`\n"
done

}

#
# SECTION III
#	Run tests
#

LOGFILE=${NSPR_TEST_LOGFILE:-$NULL_DEVICE}
OBJDIR=`basename $PWD`
echo "\nNSPR Year 2000 Test Results - $OBJDIR\n"
echo "SYSTEM:\t\t\t${SYSTEM_INFO}"
echo "NSPR_TEST_LOGFILE:\t${LOGFILE}\n"


save_date

#
# Run NSPR Y2k and standard tests
#

set_y2k_test_parameters
runtests

restore_date
