Home | History | Annotate | Download | only in tools
      1 #!/usr/bin/env python
      2 # Copyright 2017 the V8 project authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 """
      7 Wrapper script for verify-predictable mode. D8 is expected to be compiled with
      8 v8_enable_verify_predictable.
      9 
     10 The actual test command is expected to be passed to this wraper as is. E.g.:
     11 predictable_wrapper.py path/to/d8 --test --predictable --flag1 --flag2
     12 
     13 The command is run up to three times and the printed allocation hash is
     14 compared. Differences are reported as errors.
     15 """
     16 
     17 import sys
     18 
     19 from testrunner.local import command
     20 from testrunner.local import utils
     21 
     22 MAX_TRIES = 3
     23 TIMEOUT = 120
     24 
     25 # Predictable mode works only when run on the host os.
     26 command.setup(utils.GuessOS())
     27 
     28 def main(args):
     29   def allocation_str(stdout):
     30     for line in reversed((stdout or '').splitlines()):
     31       if line.startswith('### Allocations = '):
     32         return line
     33     return None
     34 
     35   cmd = command.Command(args[0], args[1:], timeout=TIMEOUT)
     36 
     37   previous_allocations = None
     38   for run in range(1, MAX_TRIES + 1):
     39     print '### Predictable run #%d' % run
     40     output = cmd.execute()
     41     if output.stdout:
     42       print '### Stdout:'
     43       print output.stdout
     44     if output.stderr:
     45       print '### Stderr:'
     46       print output.stderr
     47     print '### Return code: %s' % output.exit_code
     48     if output.HasTimedOut():
     49       # If we get a timeout in any run, we are in an unpredictable state. Just
     50       # report it as a failure and don't rerun.
     51       print '### Test timed out'
     52       return 1
     53     allocations = allocation_str(output.stdout)
     54     if not allocations:
     55       print ('### Test had no allocation output. Ensure this is built '
     56              'with v8_enable_verify_predictable and that '
     57              '--verify-predictable is passed at the cmd line.')
     58       return 2
     59     if previous_allocations and previous_allocations != allocations:
     60       print '### Allocations differ'
     61       return 3
     62     if run >= MAX_TRIES:
     63       # No difference on the last run -> report a success.
     64       return 0
     65     previous_allocations = allocations
     66   # Unreachable.
     67   assert False
     68 
     69 
     70 if __name__ == '__main__':
     71   sys.exit(main(sys.argv[1:]))
     72