# Copyright 2017 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.

from recipe_engine import post_process
from recipe_engine import recipe_api


DEPS = [
  'gclient',
  'recipe_engine/buildbucket',
  'recipe_engine/properties',
]


PROPERTIES = {
  'patch_project': recipe_api.Property(None),
  'patch_repository_url': recipe_api.Property(None),
}


def RunSteps(api, patch_project, patch_repository_url):
  src_cfg = api.gclient.make_config(CACHE_DIR='[ROOT]/git_cache')
  soln = src_cfg.solutions.add()
  soln.name = 'src'
  soln.url = 'https://chromium.googlesource.com/chromium/src.git'
  src_cfg.repo_path_map.update({
      'https://chromium.googlesource.com/src': ('src', 'HEAD'),
      'https://chromium.googlesource.com/v8/v8': ('src/v8', 'HEAD'),
      # non-canonical URL
      'https://webrtc.googlesource.com/src.git': (
          'src/third_party/webrtc', 'HEAD'),
  })
  assert api.gclient.get_repo_path(
      'https://chromium.googlesource.com/chromium/src.git',
      gclient_config=src_cfg) == 'src'
  assert api.gclient.get_repo_path(
      'https://chromium.googlesource.com/chromium/src',
      gclient_config=src_cfg) == 'src'
  assert api.gclient.get_repo_path(
      'https://chromium.googlesource.com/v8/v8',
      gclient_config=src_cfg) == 'src/v8'
  assert api.gclient.get_repo_path(
      'https://webrtc.googlesource.com/src',
      gclient_config=src_cfg) == 'src/third_party/webrtc'
  assert api.gclient.get_repo_path(
      'https://example.googlesource.com/unrecognized',
      gclient_config=src_cfg) is None

  api.gclient.c = src_cfg
  patch_root = api.gclient.get_gerrit_patch_root(gclient_config=src_cfg)
  assert patch_root == api.properties['expected_patch_root'], patch_root

  api.gclient.set_patch_repo_revision()


def GenTests(api):
  yield (
      api.test('chromium_ci') +
      api.buildbucket.ci_build(
          project='chromium',
          builder='linux',
          git_repo='https://chromium.googlesource.com/src') +
      api.properties(
          expected_patch_root=None,
          patch_project='chromium') +
      api.post_process(post_process.DropExpectation)
  )

  yield (
      api.test('chromium_try') +
      api.buildbucket.try_build(
          project='chromium',
          builder='linux',
          git_repo='https://chromium.googlesource.com/src') +
      api.properties(
          expected_patch_root='src',
          patch_project='chromium') +
      api.post_process(post_process.DropExpectation)
  )

  yield (
      api.test('v8_try') +
      api.buildbucket.try_build(
          project='chromium',
          builder='linux',
          git_repo='https://chromium.googlesource.com/v8/v8') +
      api.properties(
          expected_patch_root='src/v8',
          patch_project='v8') +
      api.post_process(post_process.DropExpectation)
  )

  yield (
      api.test('webrtc_try') +
      api.buildbucket.try_build(
          project='chromium',
          builder='linux',
          git_repo='https://webrtc.googlesource.com/src') +
      api.properties(
          expected_patch_root='src/third_party/webrtc',
          patch_project='webrtc') +
      api.post_process(post_process.DropExpectation)
  )
