Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 import os, sys
00009
00010 class Options(object):
00011 pass
00012
00013 def parseOptions(argv = None):
00014 if argv is None:
00015 argv = sys.argv[1:]
00016
00017 opts = Options()
00018 opts.package = "Unknown"
00019 opts.qmtest_args = []
00020 opts.have_user_options = False
00021 opts.output = os.path.normpath(os.path.expandvars(os.environ["QMTESTRESULTS"]))
00022 opts.qmtest_dir = os.path.normpath(os.path.expandvars(os.environ["QMTESTLOCALDIR"]))
00023 opts.dry_run = False
00024 if "GAUDI_QMTEST_HTML_OUTPUT" in os.environ:
00025 opts.html_output = os.path.normpath(os.path.expandvars(os.environ.get("GAUDI_QMTEST_HTML_OUTPUT")))
00026 else:
00027 opts.html_output = None
00028
00029
00030 if argv:
00031 opts.package = argv.pop(0)
00032
00033
00034
00035 if "QMTESTRESULTSDIR" in os.environ:
00036 opts.output = os.path.normpath(os.path.expandvars(os.environ["QMTESTRESULTSDIR"]))
00037 opts.output = os.path.join(opts.output,
00038 "%s.%s.qmr" % (opts.package, os.environ.get("CMTCONFIG", "noConfig")))
00039
00040
00041 opts.have_user_options = len(argv)
00042
00043 while argv:
00044 o = argv.pop(0)
00045 if o in ['-o','--output']:
00046
00047 opts.output = os.path.realpath(argv.pop(0))
00048 opts.have_user_options -= 2
00049 elif o in ["--no-output"]:
00050 opts.output = None
00051 opts.have_user_options -= 1
00052 elif o in ["--dry-run"]:
00053 opts.dry_run = True
00054 opts.have_user_options -= 1
00055 elif o in ["--html-output"]:
00056 opts.html_output = os.path.realpath(argv.pop(0))
00057 opts.have_user_options -= 2
00058 else:
00059 opts.qmtest_args.append(o)
00060
00061 if opts.output:
00062 opts.qmtest_args = ["-o", opts.output] + opts.qmtest_args
00063 else:
00064 opts.qmtest_args.insert(0, "--no-output")
00065 return opts
00066
00067 def main(argv = None):
00068 opts = parseOptions(argv)
00069
00070 print "==========> Running tests for package %s" % opts.package
00071
00072
00073 if opts.output:
00074 results_dest_dir = os.path.realpath(os.path.join(opts.qmtest_dir, os.path.dirname(opts.output)))
00075 if not os.path.exists(results_dest_dir):
00076 print "==========> Creating '%s'" % results_dest_dir
00077 os.makedirs(results_dest_dir, 0755)
00078
00079 print "==========> Entering '%s'" % opts.qmtest_dir
00080 os.chdir(opts.qmtest_dir)
00081
00082 qmtest_cmd = ["qmtest"]
00083
00084 if not os.path.isdir("QMTest"):
00085
00086 try:
00087 os.mkdir("QMTest")
00088 except OSError:
00089
00090 from tempfile import mkdtemp
00091 from shutil import copytree
00092
00093 tdb = os.path.join(mkdtemp("GaudiTest"), "qmtest")
00094 copytree(".", tdb)
00095 os.chmod(tdb, 0700)
00096 qmtest_cmd += ["--tdb", tdb]
00097 print "==========> Initializing QMTest database"
00098 os.system(" ".join(qmtest_cmd + ["create-tdb"]))
00099
00100 if opts.html_output:
00101 opts.qmtest_args.insert(0, '''--result-stream "GaudiTest.HTMLResultStream(dir='%s')"'''
00102 % opts.html_output.replace("\\","\\\\"))
00103
00104
00105 cmd = " ".join(qmtest_cmd + ["run"] + opts.qmtest_args)
00106
00107 if not opts.have_user_options:
00108
00109
00110
00111
00112
00113
00114
00115 suites = []
00116 if "GAUDI_QMTEST_DEFAULT_SUITE" in os.environ:
00117 suites.extend([s.strip().lower()
00118 for s in os.environ["GAUDI_QMTEST_DEFAULT_SUITE"].split(",")])
00119 suites.append(opts.package.lower())
00120 for s in suites:
00121 if os.path.exists("%s.qms" % s):
00122 cmd += " %s" % s
00123 break
00124
00125 if opts.dry_run:
00126 print "==========> Would run '%s'"%cmd
00127 else:
00128 print "==========> Running '%s'"%cmd
00129 os.system(cmd)
00130
00131
00132 if "--tdb" in qmtest_cmd:
00133 from shutil import rmtree
00134 def onerror(func, path, exc_info):
00135 """
00136 Change the permissions and try again to remove a file or a dir.
00137 Ignore failures.
00138 """
00139 if func in [os.remove, os.rmdir]:
00140
00141 try:
00142 os.chmod(path, 0600)
00143 os.chmod(os.path.dirname(path), 0700)
00144 func(path)
00145 except os.error:
00146 pass
00147 rmtree(os.path.dirname(qmtest_cmd[-1]), onerror = onerror)
00148
00149
00150
00151 if __name__ == '__main__':
00152 main()