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

import json
import os
import sys

import common


def main_run(args):
  with common.temporary_file() as tempfile_path:
    rc = common.run_command([
        sys.executable,
        os.path.join(common.SRC_DIR, 'third_party', 'blink', 'tools',
                     'run_blinkpy_tests.py'),
        '--write-full-results-to',
        tempfile_path,
    ],
                            cwd=args.paths['checkout'])

    with open(tempfile_path) as f:
      results = json.load(f)

  parsed_results = common.parse_common_test_results(results)
  failures = parsed_results['unexpected_failures']

  json.dump(
      {
          'valid':
          bool(rc <= common.MAX_FAILURES_EXIT_STATUS and
               ((rc == 0) or failures)),
          'failures':
          failures.keys(),
      }, args.output)

  return rc


def main_compile_targets(args):
  json.dump([], args.output)


if __name__ == '__main__':
  funcs = {
      'run': main_run,
      'compile_targets': main_compile_targets,
  }
  sys.exit(common.run_script(sys.argv[1:], funcs))
