#!/usr/bin/python
#
#  File: helena-test
#

import os
import sys
import test_gen

def exitWithUsage(exitCode):
    print "helena-test input-dir output-test-script"
    exit(exitCode)

if __name__ != "__main__":
    exit(0)
    
if len(sys.argv) != 3:
    exitWithUsage(1)

inDir  = sys.argv[1]
outScript  = sys.argv[2]

generator = test_gen.TestScriptGenerator()

baseCmd = "helena"
baseOptions = [
    ["-o=report.xml"],
    ["-t=20"],
    ["-sl=1000000"],
    ["-tl=60"]
]
exploreOptions = baseOptions + [
    ["-N=build-graph", "-N=explore"],
    ["-A=dfs", "-A=bfs", "-A=rwalk", "-A=delta-ddd"],
    ["-W=1", "-W=4"],
    ["-H=0", "-H=1"]
]
porOptions = [
    "-P=0", "-P=1"
]
lnaExploreOptions = exploreOptions + [ porOptions ]
dveExploreOptions = exploreOptions
ltlOptions = baseOptions + [
    ["-tr=events"],
    ["-A=dfs"],
    ["-W=1", "-W=4"],
    ["-H=0", "-H=1"],
    ["-tr=FULL", "-tr=EVENTS" ]
]
lnaLtlOptions = ltlOptions + [ porOptions ]
dveLtlOptions = ltlOptions
safetyOptions = baseOptions + [
    ["-A=dfs", "-A=bfs", "-A=rwalk", "-A=delta-ddd"],
    ["-W=1", "-W=4"],
    ["-H=0", "-H=1"],
    ["-tr=FULL", "-tr=EVENTS", "-tr=STATE" ]
]
lnaSafetyOptions = safetyOptions + [ porOptions ]
requires = [
    ("-H=1", [["-A=dfs"], ["-A=bfs"]]),
    ("-P=1", [["-A=dfs"], ["-A=bfs"]]),
    ("-N=build-graph", [["-A=delta-ddd"]])
]
postCmd = "mv report.xml %d"

#  create model lists
lnaModels = []
dveModels = []
dveLtlModels = []
for(subdir, _, files) in os.walk(inDir, followlinks = True):
    for f in files:
        (f, ext) = os.path.splitext(f)
        full = os.path.abspath(subdir + os.sep + f + ext)
        if ext == ".lna":
            (_, ext2) = os.path.splitext(f)
            if ext2 != ".prop":
                lnaModels.append(full)
        elif ext == ".dve":
            (_, ext2) = os.path.splitext(f)
            if ext2[1:5] == "prop":
                dveLtlModels.append(full)
            else:
                dveModels.append(full)

#  1st test: exploration and graph generation for lna models
t = test_gen.Test(baseCmd, options = lnaExploreOptions + [ lnaModels ],
                  requires = requires, postCmd = postCmd)
generator.addTest(t)

#  2nd test: exploration and graph generation for dve models
t = test_gen.Test(baseCmd, options = dveExploreOptions + [ dveModels ],
                  requires = requires, postCmd = postCmd)
generator.addTest(t)

#  3nd test: check properties of LNA models
for f in lnaModels:
    (m, ext) = os.path.splitext(f)
    propFile = m + ".prop.lna"
    if os.path.exists(propFile):
        pf = open(propFile)
        for str in pf:
            fields = str.split()
            if len(fields) >= 3 and fields[1] == "property":
                prop = fields[2].split(":")[0]
                if fields[0] == "ltl":
                    opts = lnaLtlOptions + [ ["-N=check-" + prop], [f]]
                elif fields[0] == "state":
                    opts = lnaSafetyOptions + [ ["-N=check-" + prop], [f]]
                else:
                    opts = []
                t = test_gen.Test(baseCmd,
                                  options = opts,
                                  requires = requires,
                                  postCmd = postCmd)
                generator.addTest(t)
        pf.close()

#  4nd test: check LTL properties of DVE models
t = test_gen.Test(baseCmd,
                  options = [["-N=check"]] + dveLtlOptions + [ dveLtlModels ],
                  requires = requires, postCmd = postCmd)
generator.addTest(t)

#  generate the script
generator.genScript(out = outScript, timeout = 70)
exit(0)
