# $Id$
import os
import sys
import time
import re
import shutil

PYTHON = os.path.basename(sys.executable)

# Usage:
#  runall.py [test-to-resume]


# Initialize test list
tests = []

# Excluded tests (because they fail?)
excluded_tests = [ "svn",
		   "pyc",
		   "scripts-call/150_srtp_2_1",				# SRTP optional 'cannot' call SRTP mandatory
                   "scripts-call/150_srtp_2_3.py",                      # temporarily disabled until #1267 done
		   "scripts-call/301_ice_public_a.py",			# Unreliable, proxy returns 408 sometimes
		   "scripts-call/301_ice_public_b.py",			# Doesn't work because OpenSER modifies SDP
		   "scripts-pres/200_publish.py",			# Ok from cmdline, error from runall.py
		   "scripts-media-playrec/100_resample_lf_8_11.py",	# related to clock-rate 11 kHz problem
		   "scripts-media-playrec/100_resample_lf_8_22.py",	# related to clock-rate 22 kHz problem
		   "scripts-media-playrec/100_resample_lf_11"		# related to clock-rate 11 kHz problem
                   ]

# Add basic tests
for f in os.listdir("scripts-run"):
    tests.append("mod_run.py scripts-run/" + f)

# Add basic call tests
for f in os.listdir("scripts-call"):
    tests.append("mod_call.py scripts-call/" + f)

# Add presence tests
for f in os.listdir("scripts-pres"):
    tests.append("mod_pres.py scripts-pres/" + f)

# Add mod_sendto tests
for f in os.listdir("scripts-sendto"):
    tests.append("mod_sendto.py scripts-sendto/" + f)

# Add mod_media_playrec tests
for f in os.listdir("scripts-media-playrec"):
    tests.append("mod_media_playrec.py scripts-media-playrec/" + f)

# Add mod_pesq tests
for f in os.listdir("scripts-pesq"):
    tests.append("mod_pesq.py scripts-pesq/" + f)

# Add recvfrom tests
for f in os.listdir("scripts-recvfrom"):
    tests.append("mod_recvfrom.py scripts-recvfrom/" + f)

# Filter-out excluded tests
for pat in excluded_tests:
    tests = [t for t in tests if t.find(pat)==-1]


resume_script=""
shell_cmd=""

# Parse arguments
sys.argv.pop(0)
while len(sys.argv):
        if sys.argv[0]=='/h' or sys.argv[0]=='-h' or sys.argv[0]=='--help' or sys.argv[0]=='/help':
                sys.argv.pop(0)
                print "Usage:"
                print "  runall.py [OPTIONS] [run.py-OPTIONS]"
                print "OPTIONS:"
                print " --list"
                print "     List the tests"
                print "  --list-xml"
                print "     List the tests as XML format suitable for ccdash"
                print "  --resume,-r RESUME"
                print "      RESUME is string/substring to specify where to resume tests."
                print "      If this argument is omited, tests will start from the beginning."
                print "  --shell,-s SHELL"
                print "      Run the tests with the specified SHELL cmd. This can also be"
                print "      used to run the test with ccdash. Example:"
                print "        --shell '/bin/sh -c'"
                print "  run.py-OPTIONS are applicable here"
                sys.exit(0)
	elif sys.argv[0] == '-r' or sys.argv[0] == '--resume':
	        if len(sys.argv) > 1:
			resume_script=sys.argv[1]
			sys.argv.pop(0)
			sys.argv.pop(1)
	        else:
	                sys.argv.pop(0)
                        sys.stderr.write("Error: argument value required")
                        sys.exit(1)
	elif sys.argv[0] == '--list':
	        sys.argv.pop(0)
		for t in tests:
		      print t
		sys.exit(0)
        elif sys.argv[0] == '--list-xml':
                sys.argv.pop(0)
                for t in tests:
                        (mod,param) = t.split(None,2)
		        tname = mod[4:mod.find(".py")] + "_" + \
		                param[param.find("/")+1:param.find(".py")]
			c = ""
			if len(sys.argv):
				c = " ".join(sys.argv) + " "
                        tcmd = PYTHON + ' run.py ' + c + t
                        print '\t\t<Test name="%s" cmd="%s" wdir="tests/pjsua" />' % (tname, tcmd)
                sys.exit(0)
        elif sys.argv[0] == '-s' or sys.argv[0] == '--shell':
                if len(sys.argv) > 1:
			shell_cmd = sys.argv[1]
			sys.argv.pop(0)
			sys.argv.pop(1)
                else:
                        sys.argv.pop(0)
                        sys.stderr.write("Error: argument value required")
                        sys.exit(1)


# Generate arguments for run.py
argv_st = " ".join(sys.argv)

# Init vars
fails_cnt = 0
tests_cnt = 0

# Re-create "logs" directory
try:
    shutil.rmtree("logs")
except:
    print "Warning: failed in removing directory 'logs'"

try:
    os.mkdir("logs")
except:
    print "Warning: failed in creating directory 'logs'"

# Now run the tests
total_cnt = len(tests)
for t in tests:
	if resume_script!="" and t.find(resume_script)==-1:
	    print "Skipping " + t +".."
            total_cnt = total_cnt - 1
	    continue
	resume_script=""
	cmdline = "python run.py " + argv_st + t
        if shell_cmd:
                cmdline = "%s '%s'" % (shell_cmd, cmdline)
	t0 = time.time()
	msg = "Running %d/%d: %s..." % (tests_cnt+1, total_cnt, cmdline)
        sys.stdout.write(msg)
        sys.stdout.flush()
	ret = os.system(cmdline + " > output.log")
	t1 = time.time()
	if ret != 0:
		dur = int(t1 - t0)
		print " failed!! [" + str(dur) + "s]"
		logname = re.search(".*\s+(.*)", t).group(1)
		logname = re.sub("[\\\/]", "_", logname)
		logname = re.sub("\.py$", ".log", logname)
		logname = "logs/" + logname
		shutil.move("output.log", logname)
		print "Please see '" + logname + "' for the test log."
		fails_cnt += 1
	else:
		dur = int(t1 - t0)
		print " ok [" + str(dur) + "s]"
	tests_cnt += 1

if fails_cnt == 0:
	print "All " + str(tests_cnt) + " tests completed successfully"
else:
	print str(tests_cnt) + " tests completed, " +  str(fails_cnt) + " test(s) failed"

