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

import os
import subprocess
import sys
import tempfile
import unittest

TOOLS_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

PREDICTABLE_WRAPPER = os.path.join(
    TOOLS_DIR, 'predictable_wrapper.py')

PREDICTABLE_MOCKED = os.path.join(
    TOOLS_DIR, 'unittests', 'testdata', 'predictable_mocked.py')

def call_wrapper(mode):
  """Call the predictable wrapper under test with a mocked file to test.

  Instead of d8, we use python and a python mock script. This mock script is
  expecting two arguments, mode (one of 'equal', 'differ' or 'missing') and
  a path to a temporary file for simulating non-determinism.
  """
  fd, state_file = tempfile.mkstemp()
  os.close(fd)
  try:
    args = [
      sys.executable,
      PREDICTABLE_WRAPPER,
      sys.executable,
      PREDICTABLE_MOCKED,
      mode,
      state_file,
    ]
    proc = subprocess.Popen(args, stdout=subprocess.PIPE)
    proc.communicate()
    return proc.returncode
  finally:
    os.unlink(state_file)


class PredictableTest(unittest.TestCase):
  def testEqualAllocationOutput(self):
    self.assertEqual(0, call_wrapper('equal'))

  def testNoAllocationOutput(self):
    self.assertEqual(2, call_wrapper('missing'))

  def testDifferentAllocationOutput(self):
    self.assertEqual(3, call_wrapper('differ'))


if __name__ == '__main__':
  unittest.main()
