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

DEPS = [
    'flutter/monorepo',
    'flutter/repo_util',
    'recipe_engine/buildbucket',
    'recipe_engine/context',
    'recipe_engine/file',
    'recipe_engine/json',
    'recipe_engine/path',
    'recipe_engine/platform',
    'recipe_engine/properties',
    'recipe_engine/raw_io',
]


def RunSteps(api):
  flutter_checkout_path = api.path.start_dir / 'flutter'
  api.repo_util.get_branch(flutter_checkout_path)
  api.repo_util.checkout(
      'flutter', flutter_checkout_path, ref='refs/heads/master'
  )
  api.repo_util.checkout(
      'engine', api.path.start_dir / 'engine', ref='refs/heads/main'
  )
  api.repo_util.checkout(
      'cocoon', api.path.start_dir / 'cocoon', ref='refs/heads/main'
  )
  api.repo_util.checkout(
      'packages', api.path.start_dir / 'packages', ref='refs/heads/main'
  )
  # we need an override because all of the previous step calls on checkout directly overrides the ref variable
  api.repo_util.checkout(
      'flutter', flutter_checkout_path, ref='refs/heads/beta'
  )
  api.repo_util.get_env_ref()

  env, env_paths = api.repo_util.engine_environment(flutter_checkout_path)
  env, env_paths = api.repo_util.monorepo_environment(flutter_checkout_path)
  env, env_paths = api.repo_util.flutter_environment(flutter_checkout_path)
  api.repo_util.in_release_and_main(flutter_checkout_path)
  checkout_path = api.path.start_dir
  if api.monorepo.is_monorepo_ci_build or api.monorepo.is_monorepo_try_build:
    api.file.ensure_directory('ensure directory', checkout_path)
    api.repo_util.monorepo_checkout(checkout_path, {}, {})
  else:
    api.file.ensure_directory('ensure directory', checkout_path / 'engine')
    api.repo_util.engine_checkout(checkout_path / 'engine', {}, {})
  with api.context(env=env, env_prefixes=env_paths):
    api.repo_util.sdk_checkout_path()
  api.repo_util.get_build(api.path.start_dir)

  method = api.properties.get('method', '')
  if method == 'get_content_hash':
    expected = api.properties.get('expectation', None)
    actual = api.repo_util.content_hash()
    assert expected is not None and actual == expected, "'%s' did not match expected ('%s') content_hash" % (
        actual, expected
    )
  if method == 'get_content_hash_url':
    content_hash = api.repo_util.content_hash()
    original = api.properties.get('original')
    actual = api.repo_util.get_content_hash_url(api, original, content_hash)
    expected = api.properties.get('expectation', None)
    assert expected is not None and actual == expected, "'%s' did not match expected ('%s') from '%s' original get_content_hash_url" % (
        actual, expected, original
    )
  if method == 'get_content_hash_url-monorepo':
    if api.monorepo.is_monorepo_ci_build or api.monorepo.is_monorepo_try_build:
      actual = api.repo_util.get_content_hash_url(api, '', '1' * 40)
      assert actual is None, "monorepo-hh does not support get_content_hash_url"


def GenTests(api):
  yield api.test(
      'mac',
      api.properties(
          git_branch='beta',
          gn_artifacts='true',
          git_url='https://github.com/flutter/engine',
          git_ref='refs/pull/1/head',
          clobber=True,
          config_name='build_config.json',
          package_sharding='shard1',
          channel='stable',
          env_variables={"key1": "value1"}
      ),
      api.repo_util.flutter_environment_data(),
      api.platform('mac', 64),
  )
  yield api.test(
      'win',
      api.properties(
          git_branch='beta',
          gn_artifacts='true',
          git_url='https://github.com/flutter/engine',
          git_ref='refs/pull/1/head',
          clobber=True,
          config_name='build_config.json',
          package_sharding='shard1',
          channel='stable',
      ),
      api.repo_util.flutter_environment_data(),
      api.platform.name('win'),
  )
  yield api.test(
      'failed_flutter_environment',
      api.properties(
          git_url='https://github.com/flutter/engine',
          git_ref='refs/pull/1/head'
      ),
      status='FAILURE'
  )
  yield api.test(
      'monorepo_release',
      api.repo_util.flutter_environment_data(),
      api.properties(
          git_branch='beta',
          clobber=True,
          config_name='build_config.json',
      ),
      api.monorepo.ci_build(git_ref='refs/heads/beta'),
      api.platform('mac', 64),
  )
  yield api.test(
      'monorepo',
      api.repo_util.flutter_environment_data(),
      api.properties(config_name='build_config.json',),
      api.monorepo.ci_build(),
  )
  yield api.test(
      'monorepo_tryjob',
      api.repo_util.flutter_environment_data(),
      api.properties(
          clobber=True,
          config_name='build_config.json',
      ),
      api.monorepo.try_build(),
  )
  yield api.test(
      'monorepo_wrong_host',
      api.repo_util.flutter_environment_data(),
      api.buildbucket.ci_build(
          git_repo='https://not-dart.googlesource.com/monorepo',
          git_ref='refs/heads/main'
      ),
      api.expect_exception('ValueError'),
  )
  yield api.test(
      'monorepo_first_bot_update_failed',
      api.repo_util.flutter_environment_data(),
      api.properties(
          clobber=True,
          config_name='build_config.json',
      ),
      api.monorepo.ci_build(),
      # Next line force a fail condition for the bot update
      # first execution.
      api.step_data("Checkout source code.bot_update", retcode=1),
  )
  yield api.test(
      'bot_update',
      api.properties(
          config_name='build_config.json',
          git_url='https://github.com/flutter/engine',
          git_ref='refs/pull/1/head',
      ),
      api.repo_util.flutter_environment_data(),
  )
  yield api.test(
      'first_bot_update_failed',
      api.properties(
          config_name='build_config.json',
          git_url='https://github.com/flutter/engine',
          git_ref='refs/pull/1/head'
      ),
      # Next line force a fail condition for the bot update
      # first execution.
      api.step_data("Checkout source code.bot_update", retcode=1),
      api.repo_util.flutter_environment_data(),
  )
  yield api.test(
      'first_bot_update_revision_not_found',
      api.properties(
          config_name='build_config.json',
          git_url='https://github.com/flutter/engine',
          git_ref='refs/pull/1/head'
      ),
      # Next line force a fail condition for the bot update
      # first execution.
      api.path.exists(
          api.path.cache_dir / 'git', api.path.start_dir / 'engine',
          *api.repo_util.flutter_environment_path()
      ),
      api.step_data(
          "Checkout source code.bot_update",
          api.json.output({
              'properties': {
                  'got_revision': 'BOT_UPDATE_NO_REV_FOUND'
              },
              # Mandatory properties required to make bot_update work.
              'did_run': True,
              'root': 'src/flutter',
              'patch_root': None,
          })
      ),
  )
  yield api.test(
      'fusion',
      api.properties(
          config_name='build_config.json',
          is_fusion=True,
          flutter_realm='foo-realm',
          flutter_prebuilt_engine_version='sha1234',
      ),
      api.repo_util.flutter_environment_data(),
  )
  yield api.test(
      'content_hash',
      api.properties(
          method='get_content_hash',
          config_name='build_config.json',
          is_fusion=True,
          flutter_realm='foo-realm',
          flutter_prebuilt_engine_version='sha1234',
          content_hash="CONTENT_HASH",
          expectation="CONTENT_HASH",
      ),
      api.repo_util.flutter_environment_data(),
      api.step_data('Read build config file'),
  )
  yield api.test(
      'get_content_hash_url',
      api.properties(
          method='get_content_hash_url',
          config_name='build_config.json',
          is_fusion=True,
          flutter_realm='foo-realm',
          flutter_prebuilt_engine_version='sha1234',
          content_hash='56a17204be67e733f009facc7b77e721181a630a',
          original='gs://flutter/foo/00a57d1a04dd1b248ebd8c980aae8034bbd7dfd1/bar.zip',
          expectation='gs://flutter/foo/56a17204be67e733f009facc7b77e721181a630a/bar.zip',
      ),
      api.repo_util.flutter_environment_data(),
  )
  yield api.test(
      'get_content_hash_url-android',
      api.properties(
          method='get_content_hash_url',
          config_name='build_config.json',
          is_fusion=True,
          flutter_realm='foo-realm',
          flutter_prebuilt_engine_version='sha1234',
          content_hash='56a17204be67e733f009facc7b77e721181a630a',
          original='gs://download.flutter.io/io/flutter/x86_debug/1.0.0-0005149dca9b248663adcde4bdd7c6c915a76584/x86_debug-1.0.0-0005149dca9b248663adcde4bdd7c6c915a76584.jar',
          expectation='gs://download.flutter.io/io/flutter/x86_debug/1.0.0-56a17204be67e733f009facc7b77e721181a630a/x86_debug-1.0.0-56a17204be67e733f009facc7b77e721181a630a.jar',
      ),
      api.repo_util.flutter_environment_data(),
  )
  yield api.test(
      'get_content_hash_url-bad-url',
      api.properties(
          method='get_content_hash_url',
          config_name='build_config.json',
          is_fusion=True,
          flutter_realm='foo-realm',
          content_hash='56a17204be67e733f009facc7b77e721181a630a',
          original='gs://flutter/foo/bad-url/bar.zip',
          flutter_prebuilt_engine_version='sha1234',
      ),
      api.expect_exception('AssertionError'),
      api.repo_util.flutter_environment_data(),
  )
  yield api.test(
      'get_content_hash_url-monorepo',
      api.properties(
          method='get_content_hash_url-monorepo',
          config_name='build_config.json',
          is_fusion=True,
          flutter_realm='foo-realm',
      ),
      api.repo_util.flutter_environment_data(),
      api.monorepo.ci_build(),
  )
  yield api.test(
      'release_branch_git_clean_failed',
      api.properties(
          config_name='build_config.json',
          git_branch='beta',
          git_url='https://github.com/flutter/engine',
          git_ref='refs/pull/1/head'
      ),
      # Force a failure of the git clean command.
      api.step_data(
          'Clean the builder cache.gclient git clean all repos', retcode=1
      ),
      api.repo_util.flutter_environment_data(),
  )
