Changeset 8364209


Ignore:
Timestamp:
Oct 29, 2019, 3:57:35 PM (2 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
arm-eh, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr
Children:
b067d9b
Parents:
c3a2007
Message:

Tests now send SIGABRT instead and SIGTERM when a test takes too long

Location:
tests
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • tests/pybin/tools.py

    rc3a2007 r8364209  
    2424# helper functions to run terminal commands
    2525def sh(*cmd, timeout = False, output_file = None, input_file = None, input_text = None, error = subprocess.STDOUT, ignore_dry_run = False):
    26         cmd = list(cmd)
    27 
    28         if input_file and input_text:
    29                 return 401, "Cannot use both text and file inputs"
    30 
    31         # if this is a dry_run, only print the commands that would be ran
    32         if settings.dry_run and not ignore_dry_run:
    33                 cmd = "{} cmd: {}".format(os.getcwd(), ' '.join(cmd))
    34                 if output_file and not isinstance(output_file, int):
    35                         cmd += " > "
    36                         cmd += output_file
    37 
    38                 if error and not isinstance(error, int):
    39                         cmd += " 2> "
    40                         cmd += error
    41 
    42                 if input_file and not isinstance(input_file, int) and os.path.isfile(input_file):
    43                         cmd += " < "
    44                         cmd += input_file
    45 
    46                 print(cmd)
    47                 return 0, None
    48 
    49         with contextlib.ExitStack() as onexit:
    50                 # add input redirection if needed
    51                 input_file = openfd(input_file, 'r', onexit, True)
    52 
    53                 # add output redirection if needed
    54                 output_file = openfd(output_file, 'w', onexit, False)
    55 
    56                 # add error redirection if needed
    57                 error = openfd(error, 'w', onexit, False)
    58 
    59                 # run the desired command
    60                 try:
    61                         proc = subprocess.run(
     26        try:
     27                cmd = list(cmd)
     28
     29                if input_file and input_text:
     30                        return 401, "Cannot use both text and file inputs"
     31
     32                # if this is a dry_run, only print the commands that would be ran
     33                if settings.dry_run and not ignore_dry_run:
     34                        cmd = "{} cmd: {}".format(os.getcwd(), ' '.join(cmd))
     35                        if output_file and not isinstance(output_file, int):
     36                                cmd += " > "
     37                                cmd += output_file
     38
     39                        if error and not isinstance(error, int):
     40                                cmd += " 2> "
     41                                cmd += error
     42
     43                        if input_file and not isinstance(input_file, int) and os.path.isfile(input_file):
     44                                cmd += " < "
     45                                cmd += input_file
     46
     47                        print(cmd)
     48                        return 0, None
     49
     50                with contextlib.ExitStack() as onexit:
     51                        # add input redirection if needed
     52                        input_file = openfd(input_file, 'r', onexit, True)
     53
     54                        # add output redirection if needed
     55                        output_file = openfd(output_file, 'w', onexit, False)
     56
     57                        # add error redirection if needed
     58                        error = openfd(error, 'w', onexit, False)
     59
     60                        # run the desired command
     61                        # use with statement to make sure proc is cleaned
     62                        # don't use subprocess.run because we want to send SIGABRT on exit
     63                        with subprocess.Popen(
    6264                                cmd,
    6365                                **({'input' : bytes(input_text, encoding='utf-8')} if input_text else {'stdin' : input_file}),
    6466                                stdout  = output_file,
    65                                 stderr  = error,
    66                                 timeout = settings.timeout.single if timeout else None
    67                         )
    68 
    69                         return proc.returncode, proc.stdout.decode("utf-8") if proc.stdout else None
    70                 except subprocess.TimeoutExpired:
    71                         return 124, str(None)
     67                                stderr  = error
     68                        ) as proc:
     69
     70                                try:
     71                                        out, _ = proc.communicate(
     72                                                timeout = settings.timeout.single if timeout else None
     73                                        )
     74
     75                                        return proc.returncode, out.decode("utf-8") if out else None
     76                                except subprocess.TimeoutExpired:
     77                                        proc.send_signal(signal.SIGABRT)
     78                                        proc.communicate()
     79                                        return 124, str(None)
     80
     81        except Exception as ex:
     82                print ("Unexpected error: %s" % ex)
     83                raise
    7284
    7385def is_ascii(fname):
  • tests/test.py

    rc3a2007 r8364209  
    210210        except KeyboardInterrupt:
    211211                return False, ""
    212         except:
    213                 print("Unexpected error in worker thread", file=sys.stderr)
     212        except Exception as ex:
     213                print("Unexpected error in worker thread: %s" % ex, file=sys.stderr)
    214214                sys.stderr.flush()
    215215                return False, ""
Note: See TracChangeset for help on using the changeset viewer.