#!/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

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:])

  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:]))
