Gaudi Framework, version v23r2

Home   Generated: Thu Jun 28 2012

run_qmtest.py

Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 #
00003 # Small wrapper script to simplify the execution of QMTest tests.
00004 #
00005 # @author: Marco Clemencic <marco.clemencic@cern.ch>
00006 # @date: 22/10/2007
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     # Defaults
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     # First argument is the package name:
00030     if argv:
00031         opts.package = argv.pop(0)
00032 
00033     # If the use specifies a directory where to collect all the results
00034     # (e.g. because running from a read-only location) we must use it
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     # Do we have user options?
00041     opts.have_user_options = len(argv)
00042     # Scan the user options (if any) to look for options we must intercept
00043     while argv:
00044         o = argv.pop(0)
00045         if o in ['-o','--output']:
00046             # make the path absolute
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     # Add the option for the output to the qmtest_args
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     # create the destination directory if necessary
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         # If the test-db directory is not initialized, we have to initialize it
00086         try:
00087             os.mkdir("QMTest")
00088         except OSError:
00089             # we cannot create the directory... we need a temporary test database
00090             from tempfile import mkdtemp
00091             from shutil import copytree
00092             # the extra level is needed because of a limitation in copytree
00093             tdb = os.path.join(mkdtemp("GaudiTest"), "qmtest")
00094             copytree(".", tdb)
00095             os.chmod(tdb, 0700) # This is needed because copytree will copy also the restrictive permissions
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     # prepare the qmtest command
00105     cmd = " ".join(qmtest_cmd + ["run"] + opts.qmtest_args)
00106 
00107     if not opts.have_user_options:
00108         # If there are no user options, we should check for a default test suite
00109         # to run.
00110         # The suite to run is the first one available in the list passed via
00111         # the environment variable GAUDI_QMTEST_DEFAULT_SUITE (comma-separated list)
00112         # or the suite with the same name as the package.
00113         # If none of them is present, no argument is passed to qmtest, so all the tests
00114         # are run.
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     # drop the temporary test DB if needed
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                 # change permissions and try again
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 # Note: the return code of qmtest is not propagated to avoid that
00150 #       CMT stops if we have a non-PASS tests (e.g. UNTESTED).
00151 if __name__ == '__main__':
00152     main()
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Thu Jun 28 2012 23:27:26 for Gaudi Framework, version v23r2 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004