#!/usr/bin/env python
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""This script is used by chrome_tests.gypi's js2webui action to maintain the
argument lists and to generate inlinable tests.
"""

from __future__ import print_function

import json
import optparse
import os
import subprocess
import sys
import shutil


def HasSameContent(filename, content):
  '''Returns true if the given file is readable and has the given content.'''
  try:
    with open(filename) as file:
      return file.read() == content
  except:
    # Ignore all errors and fall back on a safe bet.
    return False


def main ():
  parser = optparse.OptionParser()
  parser.set_usage("%prog v8_shell test_api.js js2webui.js "
                   "testtype inputfile srcrootdir cxxoutfile jsoutfile")
  parser.add_option('-v', '--verbose', action='store_true')
  parser.add_option('-n', '--impotent', action='store_true',
                    help="don't execute; just print (as if verbose)")
  parser.add_option('--deps_js', action="store",
                    help=("Path to deps.js for dependency resolution, " +
                          "optional."))
  parser.add_option('--external', action='store',
                    help="Load V8's initial snapshot from external files (y/n)")
  (opts, args) = parser.parse_args()

  if len(args) != 8:
    parser.error('all arguments are required.')
  (v8_shell, test_api, js2webui, test_type, inputfile, srcrootdir, cxxoutfile,
   jsoutfile) = args
  cmd = [v8_shell]
  arguments = [js2webui, inputfile, srcrootdir, opts.deps_js,
               cxxoutfile, test_type]
  cmd.extend(['-e', "arguments=" + json.dumps(arguments), test_api, js2webui])
  if opts.verbose or opts.impotent:
    print(cmd)
  if not opts.impotent:
    try:
      p = subprocess.Popen(
          cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=0)
      out, err = p.communicate()
      if p.returncode != 0:
        sys.stderr.write(out + err);
        return 1
      if not HasSameContent(cxxoutfile, out):
        with open(cxxoutfile, 'wb') as f:
          f.write(out)
      shutil.copyfile(inputfile, jsoutfile)
    except Exception, ex:
      if os.path.exists(cxxoutfile):
        os.remove(cxxoutfile)
      if os.path.exists(jsoutfile):
        os.remove(jsoutfile)
      raise


if __name__ == '__main__':
  sys.exit(main())
