#!/usr/bin/env python # Copyright 2017 the V8 project authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """ Wrapper script for verify-predictable mode. D8 is expected to be compiled with v8_enable_verify_predictable. The actual test command is expected to be passed to this wraper as is. E.g.: predictable_wrapper.py path/to/d8 --test --predictable --flag1 --flag2 The command is run up to three times and the printed allocation hash is compared. Differences are reported as errors. """ import sys from testrunner.local import command MAX_TRIES = 3 TIMEOUT = 120 def main(args): def allocation_str(stdout): for line in reversed((stdout or '').splitlines()): if line.startswith('### Allocations = '): return line return None cmd = command.Command(args[0], args[1:], timeout=TIMEOUT) previous_allocations = None for run in range(1, MAX_TRIES + 1): print '### Predictable run #%d' % run output = cmd.execute() if output.stdout: print '### Stdout:' print output.stdout if output.stderr: print '### Stderr:' print output.stderr print '### Return code: %s' % output.exit_code if output.HasTimedOut(): # If we get a timeout in any run, we are in an unpredictable state. Just # report it as a failure and don't rerun. print '### Test timed out' return 1 allocations = allocation_str(output.stdout) if not allocations: print ('### Test had no allocation output. Ensure this is built ' 'with v8_enable_verify_predictable and that ' '--verify-predictable is passed at the cmd line.') return 2 if previous_allocations and previous_allocations != allocations: print '### Allocations differ' return 3 if run >= MAX_TRIES: # No difference on the last run -> report a success. return 0 previous_allocations = allocations # Unreachable. assert False if __name__ == '__main__': sys.exit(main(sys.argv[1:]))