[commit: ghc] master: Testsuite: assume timeout_prog always exists (e170d19)

git at git.haskell.org git at git.haskell.org
Mon Jun 20 14:37:08 UTC 2016


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/e170d19702504dd80c2d19f63322c6a219d65f8d/ghc

>---------------------------------------------------------------

commit e170d19702504dd80c2d19f63322c6a219d65f8d
Author: Thomas Miedema <thomasmiedema at gmail.com>
Date:   Mon Jun 20 13:07:19 2016 +0200

    Testsuite: assume timeout_prog always exists
    
    Merge the following functions into one:
      * rawSystem
      * rawSystemWithTimeout
      * runCmd
      * runCmdFor
      * runCmdExitCode
    
    I don't know why this wasn't done before.


>---------------------------------------------------------------

e170d19702504dd80c2d19f63322c6a219d65f8d
 testsuite/driver/testlib.py | 114 +++++++++++---------------------------------
 1 file changed, 28 insertions(+), 86 deletions(-)

diff --git a/testsuite/driver/testlib.py b/testsuite/driver/testlib.py
index 4f18c01..0fc764b 100644
--- a/testsuite/driver/testlib.py
+++ b/testsuite/driver/testlib.py
@@ -855,14 +855,10 @@ def do_test(name, way, func, args, files):
         if config.use_threads:
             t.lock.release()
 
-        try:
-            preCmd = getTestOpts().pre_cmd
-            if preCmd != None:
-                result = runCmdFor(name, 'cd "{opts.testdir}" && {preCmd}'.format(**locals()))
-                if result != 0:
-                    framework_fail(name, way, 'pre-command failed: ' + str(result))
-        except:
-            framework_fail(name, way, 'pre-command exception')
+        if opts.pre_cmd:
+            exit_code = runCmd('cd "{0}" && {1}'.format(opts.testdir, opts.pre_cmd))
+            if exit_code != 0:
+                framework_fail(name, way, 'pre_cmd failed: {0}'.format(exit_code))
 
         try:
             result = func(*[name,way] + args)
@@ -1230,11 +1226,11 @@ def simple_build(name, way, extra_hc_opts, should_fail, top_mod, link, addsuf):
            '> {errname} 2>&1'
           ).format(**locals())
 
-    result = runCmdFor(name, cmd, timeout_multiplier=opts.compile_timeout_multiplier)
+    exit_code = runCmd(cmd, opts.compile_timeout_multiplier)
 
-    if result != 0 and not should_fail:
+    if exit_code != 0 and not should_fail:
         if config.verbose >= 1 and _expect_pass(way):
-            print('Compile failed (status ' + repr(result) + ') errors were:')
+            print('Compile failed (exit code {0}) errors were:'.format(exit_code))
             actual_stderr_path = in_testdir(name, 'comp.stderr')
             if_verbose_dump(1, actual_stderr_path)
 
@@ -1246,10 +1242,10 @@ def simple_build(name, way, extra_hc_opts, should_fail, top_mod, link, addsuf):
         return statsResult
 
     if should_fail:
-        if result == 0:
+        if exit_code == 0:
             return failBecause('exit code 0')
     else:
-        if result != 0:
+        if exit_code != 0:
             return failBecause('exit code non-0')
 
     return passed()
@@ -1310,10 +1306,7 @@ def simple_run(name, way, prog, extra_run_opts):
     cmd = 'cd "{opts.testdir}" && {cmd}'.format(**locals())
 
     # run the command
-    result = runCmdFor(name, cmd, timeout_multiplier=opts.run_timeout_multiplier)
-
-    exit_code = result >> 8
-    signal    = result & 0xff
+    exit_code = runCmd(cmd, opts.run_timeout_multiplier)
 
     # check the exit code
     if exit_code != opts.exit_code:
@@ -1415,10 +1408,7 @@ def interpreter_run( name, way, extra_hc_opts, compile_only, top_mod ):
 
     cmd = 'cd "{opts.testdir}" && {cmd}'.format(**locals())
 
-    result = runCmdFor(name, cmd, timeout_multiplier=opts.run_timeout_multiplier)
-
-    exit_code = result >> 8
-    signal    = result & 0xff
+    exit_code = runCmd(cmd, opts.run_timeout_multiplier)
 
     # split the stdout into compilation/program output
     split_file(in_testdir(outname), delimiter,
@@ -1556,14 +1546,14 @@ def check_hp_ok(name):
     # do not qualify for hp2ps because we should be in the right directory
     hp2psCmd = 'cd "{opts.testdir}" && {{hp2ps}} {name}'.format(**locals())
 
-    hp2psResult = runCmdExitCode(hp2psCmd)
+    hp2psResult = runCmd(hp2psCmd)
 
     actual_ps_path = in_testdir(name, 'ps')
 
-    if(hp2psResult == 0):
-        if (os.path.exists(actual_ps_path)):
+    if hp2psResult == 0:
+        if os.path.exists(actual_ps_path):
             if gs_working:
-                gsResult = runCmdExitCode(genGSCmd(actual_ps_path))
+                gsResult = runCmd(genGSCmd(actual_ps_path))
                 if (gsResult == 0):
                     return (True)
                 else:
@@ -1837,75 +1827,27 @@ def if_verbose_dump( n, f ):
         except:
             print('')
 
-def rawSystem(cmd_and_args):
-    # We prefer subprocess.call to os.spawnv as the latter
-    # seems to send its arguments through a shell or something
-    # with the Windows (non-cygwin) python. An argument "a b c"
-    # turns into three arguments ["a", "b", "c"].
+def runCmd(cmd, timeout_multiplier=1.0):
+    timeout_prog = strip_quotes(config.timeout_prog)
+    timeout = str(int(ceil(config.timeout * timeout_multiplier)))
 
-    cmd = cmd_and_args[0]
-    return subprocess.call([strip_quotes(cmd)] + cmd_and_args[1:])
+    # Format cmd using config. Example: cmd='{hpc} report A.tix'
+    cmd = cmd.format(**config.__dict__)
+    if_verbose( 3, cmd )
 
-# Note that this doesn't handle the timeout itself; it is just used for
-# commands that have timeout handling built-in.
-def rawSystemWithTimeout(cmd_and_args):
-    r = rawSystem(cmd_and_args)
+    # cmd is a complex command in Bourne-shell syntax
+    # e.g (cd . && 'C:/users/simonpj/HEAD/inplace/bin/ghc-stage2' ...etc)
+    # Hence it must ultimately be run by a Bourne shell. It's timeout's job
+    # to invoke the Bourne shell
+    r = subprocess.call([timeout_prog, timeout, cmd])
     if r == 98:
         # The python timeout program uses 98 to signal that ^C was pressed
         stopNow()
     if r == 99 and getTestOpts().exit_code != 99:
         # Only print a message when timeout killed the process unexpectedly.
-        cmd = cmd_and_args[-1]
         if_verbose(1, 'Timeout happened...killed process "{0}"...\n'.format(cmd))
     return r
 
-# cmd is a complex command in Bourne-shell syntax
-# e.g (cd . && 'c:/users/simonpj/darcs/HEAD/compiler/stage1/ghc-inplace' ...etc)
-# Hence it must ultimately be run by a Bourne shell
-#
-# Mostly it invokes the command wrapped in 'timeout' thus
-#  timeout 300 'cd . && ...blah blah'
-# so it's timeout's job to invoke the Bourne shell
-#
-# But watch out for the case when there is no timeout program!
-# Then, when using the native Python, os.system will invoke the cmd shell
-
-def runCmd( cmd ):
-    # Format cmd using config. Example: cmd='{hpc} report A.tix'
-    cmd = cmd.format(**config.__dict__)
-
-    if_verbose( 3, cmd )
-    r = 0
-    if config.os == 'mingw32':
-        # On MinGW, we will always have timeout
-        assert config.timeout_prog!=''
-
-    if config.timeout_prog != '':
-        r = rawSystemWithTimeout([config.timeout_prog, str(config.timeout), cmd])
-    else:
-        r = os.system(cmd)
-    return r << 8
-
-def runCmdFor( name, cmd, timeout_multiplier=1.0 ):
-    # Format cmd using config. Example: cmd='{hpc} report A.tix'
-    cmd = cmd.format(**config.__dict__)
-
-    if_verbose( 3, cmd )
-    r = 0
-    if config.os == 'mingw32':
-        # On MinGW, we will always have timeout
-        assert config.timeout_prog!=''
-    timeout = int(ceil(config.timeout * timeout_multiplier))
-
-    if config.timeout_prog != '':
-        r = rawSystemWithTimeout([config.timeout_prog, str(timeout), cmd])
-    else:
-        r = os.system(cmd)
-    return r << 8
-
-def runCmdExitCode( cmd ):
-    return (runCmd(cmd) >> 8);
-
 # -----------------------------------------------------------------------------
 # checking if ghostscript is available for checking the output of hp2ps
 
@@ -1920,9 +1862,9 @@ global gs_working
 gs_working = 0
 if config.have_profiling:
   if config.gs != '':
-    resultGood = runCmdExitCode(genGSCmd(config.confdir + '/good.ps'));
+    resultGood = runCmd(genGSCmd(config.confdir + '/good.ps'));
     if resultGood == 0:
-        resultBad = runCmdExitCode(genGSCmd(config.confdir + '/bad.ps') +
+        resultBad = runCmd(genGSCmd(config.confdir + '/bad.ps') +
                                    ' >/dev/null 2>&1')
         if resultBad != 0:
             print("GhostScript available for hp2ps tests")



More information about the ghc-commits mailing list