# Copyright (c) 2013 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.

"""Presubmit script for android buildbot.

See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
details on the presubmit API built into depot_tools.
"""


def CommonChecks(input_api, output_api):
  output = []

  build_android_dir = input_api.PresubmitLocalPath()

  def J(*dirs):
    """Returns a path relative to presubmit directory."""
    return input_api.os_path.join(build_android_dir, *dirs)

  build_pys = [
      r'gyp/.*\.py$',
      r'gn/.*\.py',
  ]
  output.extend(input_api.canned_checks.RunPylint(
      input_api,
      output_api,
      pylintrc='pylintrc',
      black_list=build_pys,
      extra_paths_list=[
          J(),
          J('gyp'),
          J('buildbot'),
          J('..', 'util', 'lib', 'common'),
          J('..', '..', 'third_party', 'catapult', 'common', 'py_trace_event'),
          J('..', '..', 'third_party', 'catapult', 'common', 'py_utils'),
          J('..', '..', 'third_party', 'catapult', 'devil'),
          J('..', '..', 'third_party', 'catapult', 'tracing'),
          J('..', '..', 'third_party', 'depot_tools'),
      ]))
  output.extend(input_api.canned_checks.RunPylint(
      input_api,
      output_api,
      white_list=build_pys,
      extra_paths_list=[J('gyp'), J('gn')]))

  # Disabled due to http://crbug.com/410936
  #output.extend(input_api.canned_checks.RunUnitTestsInDirectory(
  #input_api, output_api, J('buildbot', 'tests')))

  pylib_test_env = dict(input_api.environ)
  pylib_test_env.update({
      'PYTHONPATH': build_android_dir,
      'PYTHONDONTWRITEBYTECODE': '1',
  })
  output.extend(
      input_api.canned_checks.RunUnitTests(
          input_api,
          output_api,
          unit_tests=[
              J('.', 'emma_coverage_stats_test.py'),
              J('.', 'list_class_verification_failures_test.py'),
              J('gyp', 'util', 'build_utils_test.py'),
              J('gyp', 'util', 'md5_check_test.py'),
              J('gyp', 'util', 'resource_utils_test.py'),
              J('pylib', 'constants', 'host_paths_unittest.py'),
              J('pylib', 'gtest', 'gtest_test_instance_test.py'),
              J('pylib', 'instrumentation',
                'instrumentation_test_instance_test.py'),
              J('pylib', 'local', 'device',
                'local_device_instrumentation_test_run_test.py'),
              J('pylib', 'local', 'device', 'local_device_test_run_test.py'),
              J('pylib', 'output', 'local_output_manager_test.py'),
              J('pylib', 'output', 'noop_output_manager_test.py'),
              J('pylib', 'output', 'remote_output_manager_test.py'),
              J('pylib', 'results', 'json_results_test.py'),
              J('pylib', 'symbols', 'apk_native_libs_unittest.py'),
              J('pylib', 'symbols', 'elf_symbolizer_unittest.py'),
              J('pylib', 'symbols', 'symbol_utils_unittest.py'),
              J('pylib', 'utils', 'decorators_test.py'),
              J('pylib', 'utils', 'device_dependencies_test.py'),
              J('pylib', 'utils', 'dexdump_test.py'),
              J('pylib', 'utils', 'proguard_test.py'),
              J('pylib', 'utils', 'test_filter_test.py'),
              J('.', 'convert_dex_profile_tests.py'),
          ],
          env=pylib_test_env))

  return output


def CheckChangeOnUpload(input_api, output_api):
  return CommonChecks(input_api, output_api)


def CheckChangeOnCommit(input_api, output_api):
  return CommonChecks(input_api, output_api)
