#!/usr/bin/env python
# Copyright (c) 2015 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.

import os
import platform
import sys

_CATAPULT_PATH = os.path.abspath(
    os.path.join(
        os.path.dirname(os.path.realpath(__file__)),
        os.path.pardir,
        os.path.pardir))
_TRACING_PATH = os.path.join(_CATAPULT_PATH, 'tracing')


def _RunTestsOrDie(top_level_dir):
  exit_code = run_with_typ.Run(top_level_dir, path=[_TRACING_PATH])
  if exit_code:
    sys.exit(exit_code)


def _AddToPathIfNeeded(path):
  if path not in sys.path:
    sys.path.insert(0, path)


if __name__ == '__main__':
  _AddToPathIfNeeded(_CATAPULT_PATH)

  from hooks import install
  if '--no-install-hooks' in sys.argv:
    sys.argv.remove('--no-install-hooks')
  else:
    install.InstallHooks()

  from catapult_build import run_with_typ
  # https://github.com/catapult-project/catapult/issues/2050
  if platform.system() != 'Windows':
    _RunTestsOrDie(os.path.join(_TRACING_PATH, 'tracing'))
  _RunTestsOrDie(os.path.join(_TRACING_PATH, 'tracing_build'))
  sys.exit(0)
