# Copyright 2016 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 contextlib import contextmanager

from PB.recipes.flutter.engine.engine import InputProperties
from PB.recipes.flutter.engine.engine import EnvProperties

from PB.go.chromium.org.luci.buildbucket.proto import build as build_pb2
from google.protobuf import struct_pb2, json_format

DEPS = [
    'depot_tools/depot_tools',
    'depot_tools/gclient',
    'depot_tools/gsutil',
    'flutter/archives',
    'flutter/bucket_util',
    'flutter/build_util',
    'flutter/display_util',
    'flutter/flutter_bcid',
    'flutter/flutter_deps',
    'flutter/goma',
    'flutter/logs_util',
    'flutter/os_utils',
    'flutter/osx_sdk',
    'flutter/repo_util',
    'flutter/retry',
    'flutter/shard_util_v2',
    'flutter/test_utils',
    'flutter/zip',
    'fuchsia/gcloud',
    'recipe_engine/buildbucket',
    'recipe_engine/cas',
    'recipe_engine/cipd',
    'recipe_engine/context',
    'recipe_engine/file',
    'recipe_engine/futures',
    'recipe_engine/path',
    'recipe_engine/platform',
    'recipe_engine/properties',
    'recipe_engine/raw_io',
    'recipe_engine/runtime',
    'recipe_engine/step',
    'recipe_engine/swarming',
]

# Account for ~1 hour queue time when there is a high number of commits.
DRONE_TIMEOUT_SECS = 7200

BUCKET_NAME = 'flutter_infra_release'
MAVEN_BUCKET_NAME = 'download.flutter.io'
FUCHSIA_ARTIFACTS_BUCKET_NAME = 'fuchsia-artifacts-release'
FUCHSIA_ARTIFACTS_DEBUG_NAMESPACE = 'debug'
ICU_DATA_PATH = 'third_party/icu/flutter/icudtl.dat'
GIT_REPO = (
    'https://flutter.googlesource.com/mirrors/engine'
)

PROPERTIES = InputProperties
ENV_PROPERTIES = EnvProperties

IMPELLERC_SHADER_LIB_PATH = 'shader_lib'


# Relative paths used to mock paths for testing.
MOCK_JAR_PATH = (
    'io/flutter/x86_debug/'
    '1.0.0-0005149dca9b248663adcde4bdd7c6c915a76584/'
    'x86_debug-1.0.0-0005149dca9b248663adcde4bdd7c6c915a76584.jar'
)
MOCK_POM_PATH = (
    'io/flutter/x86_debug/'
    '1.0.0-0005149dca9b248663adcde4bdd7c6c915a76584/'
    'x86_debug-1.0.0-0005149dca9b248663adcde4bdd7c6c915a76584.pom'
)

# Used for mock paths
DIRECTORY = 'DIRECTORY'


def UploadArtifact(api, config, platform, artifact_name):
  path = GetCheckoutPath(api).join(
      'out',
      config,
      'zip_archives',
      platform,
      artifact_name
  )
  api.path.mock_add_file(path)
  assert api.path.exists(path), '%s does not exist' % str(path)
  if not api.flutter_bcid.is_prod_build():
    return
  dst = '%s/%s' % (platform, artifact_name) if platform else artifact_name
  api.bucket_util.safe_upload(
      path,
      GetCloudPath(api, dst)
  )


def UploadToDownloadFlutterIO(api, config):
  src = GetCheckoutPath(api).join(
      'out',
      config,
      'zip_archives',
      'download.flutter.io'
  )
  api.path.mock_add_file(src)
  assert api.path.exists(src), '%s does not exist' % str(src)
  if not api.flutter_bcid.is_prod_build():
    return
  paths = api.file.listdir(
      'Expand directory', src,
      recursive=True, test_data=(MOCK_JAR_PATH, MOCK_POM_PATH))
  paths = [api.path.abspath(p) for p in paths]
  experimental = 'experimental' if api.runtime.is_experimental else ''
  for path in paths:
    dst_list = [
        'gs://download.flutter.io',
        experimental,
        str(path).split('download.flutter.io/')[1]
    ]
    dst = '/'.join(filter(bool, dst_list))
    api.archives.upload_artifact(path, dst)


def GetCheckoutPath(api):
  return api.path['cache'].join('builder', 'src')


def GetCloudPath(api, path):
  git_hash = api.buildbucket.gitiles_commit.id
  if api.runtime.is_experimental:
    return 'flutter/experimental/%s/%s' % (git_hash, path)
  return 'flutter/%s/%s' % (git_hash, path)


def Build(api, config, *targets):
  checkout = GetCheckoutPath(api)
  build_dir = checkout.join('out/%s' % config)
  goma_jobs = api.properties['goma_jobs']
  ninja_path = checkout.join('flutter', 'third_party', 'ninja', 'ninja')
  ninja_args = [ninja_path, '-j', goma_jobs, '-C', build_dir]
  ninja_args.extend(targets)
  with api.goma(), api.depot_tools.on_path():
    name = 'build %s' % ' '.join([config] + list(targets))
    api.step(name, ninja_args)


def RunTests(api, out_dir, android_out_dir=None, types='all'):
  script_path = GetCheckoutPath(api).join('flutter', 'testing', 'run_tests.py')
  # TODO(godofredoc): use .vpython from engine when file are available.
  venv_path = api.depot_tools.root.join('.vpython3')
  args = [
      'vpython3', '-vpython-spec', venv_path,
      script_path,
      '--variant', out_dir,
      '--type', types,
      '--engine-capture-core-dump'
  ]
  if android_out_dir:
    args.extend(['--android-variant', android_out_dir])

  step_name = api.test_utils.test_step_name('Host Tests for %s' % out_dir)

  def run_test():
    # Sometimes tests build artifacts, which will be extremelly slow if it does not run
    # from a goma context.
    env = {'GOMA_DIR': api.goma.goma_dir}
    with api.context(env=env):
      return api.step(step_name, args)

  # Rerun test step 3 times by default if failing.
  # TODO(keyonghan): notify tree gardener for test failures/flakes:
  # https://github.com/flutter/flutter/issues/89308
  api.retry.wrap(run_test, step_name=step_name)


def ScheduleBuilds(api, builder_name, drone_props):
  req = api.buildbucket.schedule_request(
      swarming_parent_run_id=api.swarming.task_id,
      builder=builder_name,
      properties=drone_props,
      # Having main build and subbuilds with the same priority can lead
      # to a deadlock situation when there are limited resources. For example
      # if we have only 7 mac bots and we get more than 7 new build requests the
      # within minutes of each other then the 7 bots will be used by main tasks
      # and they will all timeout waiting for resources to run subbuilds.
      # Increasing priority won't fix the problem but will make the deadlock
      # situation less unlikely.
      # https://github.com/flutter/flutter/issues/59169.
      #
      # Set priority to be same of main build temporily to help triage
      # https://github.com/flutter/flutter/issues/124155
      priority=30,
      exe_cipd_version=api.properties.get('exe_cipd_version', 'refs/heads/main')
  )
  return api.buildbucket.schedule([req])


def CancelBuilds(api, builds):
  for build in builds:
    api.buildbucket.cancel_build(build.id)


def CollectBuilds(api, builds):
  return api.buildbucket.collect_builds([build.id for build in builds],
                                        timeout=DRONE_TIMEOUT_SECS,
                                        mirror_status=True)


def GetFlutterFuchsiaBuildTargets(product, include_test_targets=False):
  targets = ['flutter/shell/platform/fuchsia:fuchsia']
  if include_test_targets:
    targets += ['fuchsia_tests']
  return targets


def GetFuchsiaOutputFiles(product):
  return [
      'dart_jit_%srunner' % ('product_' if product else ''),
      'dart_aot_%srunner' % ('product_' if product else ''),
      'flutter_jit_%srunner' % ('product_' if product else ''),
      'flutter_aot_%srunner' % ('product_' if product else ''),
  ]


def GetFuchsiaOutputDirs(product):
  return [
      'dart_jit_%srunner_far' % ('product_' if product else ''),
      'dart_aot_%srunner_far' % ('product_' if product else ''),
      'flutter_jit_%srunner_far' % ('product_' if product else ''),
      'flutter_aot_%srunner_far' % ('product_' if product else ''),
      'dart_runner_patched_sdk',
      'flutter_runner_patched_sdk',
      'clang_x64',
      '.build-id',
  ]


def BuildAndPackageFuchsia(api, build_script, git_rev):
  RunGN(
      api, '--fuchsia', '--fuchsia-cpu', 'x64', '--runtime-mode', 'debug',
      '--no-lto',
  )
  Build(api, 'fuchsia_debug_x64', *GetFlutterFuchsiaBuildTargets(False, True))

  # Package debug x64 on Linux builds.
  #
  # We pass --skip-build here, which means build_script will only take the existing artifacts
  # that we just built and package them. Invoking this command will not build fuchsia artifacts
  # despite the name of the build_script being build_fuchsia_artifacts.
  #
  # TODO(akbiggs): What is this actually used for? The artifacts aren't uploaded here,
  # they're uploaded in a second call to build_fuchsia_artifacts.py later, and calling
  # build_fuchsia_artifacts.py again will delete the bucket we created from the previous run. So
  # what is the package we're creating here used for?
  #
  # TODO(akbiggs): Clean this up if we feel brave.
  if api.platform.is_linux:
    fuchsia_package_cmd = [
        'python3', build_script, '--engine-version', git_rev, '--skip-build',
        '--archs', 'x64', '--runtime-mode', 'debug',
    ]
    api.step('Package Fuchsia Artifacts', fuchsia_package_cmd)

  RunGN(
      api, '--fuchsia', '--fuchsia-cpu', 'arm64', '--runtime-mode', 'debug',
      '--no-lto',
  )
  Build(api, 'fuchsia_debug_arm64', *GetFlutterFuchsiaBuildTargets(False, True))


def RunGN(api, *args):
  checkout = GetCheckoutPath(api)
  gn_cmd = ['python3', checkout.join('flutter/tools/gn'), '--goma']
  if api.properties.get('no_lto', False) and '--no-lto' not in args:
    args += ('--no-lto',)
  gn_cmd.extend(args)
  # Run GN with a goma_dir context.
  env = {'GOMA_DIR': api.goma.goma_dir}
  with api.context(env=env):
    api.step('gn %s' % ' '.join(args), gn_cmd)


def UploadArtifacts(
    api,
    platform,
    file_paths=[],
    directory_paths=[],
    archive_name='artifacts.zip',
    pkg_root=None
):
  dir_label = '%s UploadArtifacts %s' % (platform, archive_name)
  with api.os_utils.make_temp_directory(dir_label) as temp_dir:
    local_zip = temp_dir.join('artifacts.zip')
    remote_name = '%s/%s' % (platform, archive_name)
    remote_zip = GetCloudPath(api, remote_name)
    if pkg_root is None:
      pkg_root = GetCheckoutPath(api)
    pkg = api.zip.make_package(pkg_root, local_zip)
    api.bucket_util.add_files(pkg, file_paths)
    api.bucket_util.add_directories(pkg, directory_paths)

    pkg.zip('Zip %s %s' % (platform, archive_name))
    api.bucket_util.safe_upload(local_zip, remote_zip)


def UploadSkyEngineToCIPD(api, package_name):
  git_rev = api.buildbucket.gitiles_commit.id or 'HEAD'
  package_dir = 'src/out/android_debug/dist/packages'
  parent_dir = api.path['cache'].join('builder', package_dir)
  folder_path = parent_dir.join(package_name)
  with api.os_utils.make_temp_directory(package_name) as temp_dir:
    zip_path = temp_dir.join('%s.zip' % package_name)
    cipd_package_name = 'flutter/%s' % package_name
    api.cipd.build(
        folder_path, zip_path, cipd_package_name, install_mode='copy'
    )
    if api.bucket_util.should_upload_packages():
      api.cipd.register(
          cipd_package_name,
          zip_path,
          refs=['latest'],
          tags={'git_revision': git_rev}
      )


def UploadSkyEngineDartPackage(api):
  UploadSkyEngineToCIPD(api, 'sky_engine')


def VerifyExportedSymbols(api):
  checkout = GetCheckoutPath(api)
  out_dir = checkout.join('out')
  script_dir = checkout.join('flutter/testing/symbols')
  script_path = script_dir.join('verify_exported.dart')
  api.step(
      'Verify exported symbols on release binaries',
      ['dart', script_path, out_dir]
  )


def UploadTreeMap(api, upload_dir, lib_flutter_path, android_triple):
  with api.os_utils.make_temp_directory('treemap') as temp_dir:
    checkout = GetCheckoutPath(api)
    script_path = checkout.join(
        'third_party/dart/runtime/'
        'third_party/binary_size/src/run_binary_size_analysis.py'
    )
    library_path = checkout.join(lib_flutter_path)
    destination_dir = temp_dir.join('sizes')
    addr2line = checkout.join(
        'third_party/android_tools/ndk/toolchains/' + android_triple +
        '-4.9/prebuilt/linux-x86_64/bin/' + android_triple + '-addr2line'
    )
    args = [
        '--library', library_path, '--destdir', destination_dir,
        "--addr2line-binary", addr2line
    ]

    # additional info: https://github.com/flutter/flutter/issues/84377
    file_command = ['file', library_path]
    api.step('file on libflutter.so', file_command)
    sha1sum_command = ['sha1sum', library_path]
    api.step('sha1sum on libflutter.so', sha1sum_command)

    command = ['python3', script_path]
    command.extend(args)
    api.step('generate treemap for %s' % upload_dir, command)

    remote_name = GetCloudPath(api, upload_dir)
    if api.bucket_util.should_upload_packages():
      # TODO(fujino): create SafeUploadDirectory() wrapper
      result = api.gsutil.upload(
          destination_dir,
          BUCKET_NAME,
          remote_name,
          args=['-r'],
          name='upload treemap for %s' % lib_flutter_path,
          link_name=None
      )
      result.presentation.links['Open Treemap'] = (
          'https://storage.googleapis.com/%s/%s/sizes/index.html' %
          (BUCKET_NAME, remote_name)
      )


class AndroidAotVariant:

  def __init__(
      self, android_cpu, out_dir, artifact_dir, clang_dir, android_triple, abi,
      gn_args, ninja_targets
  ):
    self.android_cpu = android_cpu
    self.out_dir = out_dir
    self.artifact_dir = artifact_dir
    self.clang_dir = clang_dir
    self.android_triple = android_triple
    self.abi = abi
    self.gn_args = gn_args
    self.ninja_targets = ninja_targets

  def GetBuildOutDir(self):
    return self.out_dir

  def GetUploadDir(self):
    return self.artifact_dir

  def GetLibFlutterPath(self):
    return 'libflutter.so'

  def GetGNArgs(self):
    return self.gn_args

  def GetNinjaTargets(self):
    return self.ninja_targets


# This variant is built on the scheduling bot to run firebase tests.
def BuildLinuxAndroidAOTArm64Profile(api, swarming_task_id, aot_variant):
  checkout = GetCheckoutPath(api)
  build_output_dir = aot_variant.GetBuildOutDir()

  RunGN(api, *aot_variant.GetGNArgs())
  Build(api, build_output_dir, *aot_variant.GetNinjaTargets())

  env = {
    'STORAGE_BUCKET': 'gs://flutter_firebase_testlab_staging',
    'GCP_PROJECT': 'flutter-infra-staging'
  }

  with api.context(env=env, cwd=checkout):
    args = [
        'python3', './flutter/ci/firebase_testlab.py',
        '--variant', build_output_dir,
        '--build-id', swarming_task_id,
    ]

    step_name = api.test_utils.test_step_name('Android Firebase Test')

    def firebase_func():
      api.step(step_name, args)

    api.retry.wrap(
        firebase_func, step_name=step_name, retriable_codes=(1, 15, 20)
    )


def BuildLinuxAndroidAOT(api, swarming_task_id):
  # Build and upload engines for the runtime modes that use AOT compilation.
  # Do arm64 first because we have more tests for that one, and can bail out
  # earlier if they fail.
  aot_variants = [
      AndroidAotVariant(
          android_cpu='arm64',
          out_dir='android_profile_arm64',
          artifact_dir='android-arm64-profile',
          clang_dir='clang_x64',
          android_triple='aarch64-linux-android',
          abi='arm64_v8a',
          gn_args=[
              '--runtime-mode',
              'profile',
              '--android',
              '--android-cpu',
              'arm64'
          ],
          ninja_targets=[
              'default',
              'clang_x64/gen_snapshot',
              'flutter/shell/platform/android:abi_jars',
              'flutter/shell/platform/android:analyze_snapshot'
          ]
      ),
      AndroidAotVariant(
          android_cpu='arm64',
          out_dir='android_release_arm64',
          artifact_dir='android-arm64-release',
          clang_dir='clang_x64',
          android_triple='aarch64-linux-android',
          abi='arm64_v8a',
          gn_args=[
              '--runtime-mode',
              'release',
              '--android',
              '--android-cpu',
              'arm64'
          ],
          ninja_targets=[
              'default',
              'clang_x64/gen_snapshot',
              'flutter/shell/platform/android:abi_jars',
              'flutter/shell/platform/android:analyze_snapshot'
          ]
      ),
      AndroidAotVariant(
          android_cpu='arm',
          out_dir='android_profile',
          artifact_dir='android-arm-profile',
          clang_dir='clang_x64',
          android_triple='arm-linux-androideabi',
          abi='armeabi_v7a',
          gn_args=[
              '--runtime-mode',
              'profile',
              '--android',
              '--android-cpu', 'arm'
          ],
          ninja_targets=[
              'default',
              'clang_x64/gen_snapshot',
              'flutter/shell/platform/android:embedding_jars',
              'flutter/shell/platform/android:abi_jars'
          ]
      ),
      AndroidAotVariant(
          android_cpu='arm',
          out_dir='android_release',
          artifact_dir='android-arm-release',
          clang_dir='clang_x64',
          android_triple='arm-linux-androideabi',
          abi='armeabi_v7a',
          gn_args=[
              '--runtime-mode',
              'release',
              '--android',
              '--android-cpu',
              'arm'
          ],
          ninja_targets=[
              'default',
              'clang_x64/gen_snapshot',
              'flutter/shell/platform/android:embedding_jars',
              'flutter/shell/platform/android:abi_jars'
          ]
      ),
      AndroidAotVariant(
          android_cpu='x64',
          out_dir='android_profile_x64',
          artifact_dir='android-x64-profile',
          clang_dir='clang_x64',
          android_triple='x86_64-linux-android',
          abi='x86_64',
          gn_args=[
              '--runtime-mode',
              'profile',
              '--android',
              '--android-cpu',
              'x64'
          ],
          ninja_targets=[
              'default',
              'clang_x64/gen_snapshot',
              'flutter/shell/platform/android:abi_jars',
              'flutter/shell/platform/android:analyze_snapshot'
          ]
      ),
      AndroidAotVariant(
          android_cpu='x64',
          out_dir='android_release_x64',
          artifact_dir='android-x64-release',
          clang_dir='clang_x64',
          android_triple='x86_64-linux-android',
          abi='x86_64',
          gn_args=[
              '--runtime-mode',
              'release',
              '--android',
              '--android-cpu', 'x64'
          ],
          ninja_targets=[
              'default',
              'clang_x64/gen_snapshot',
              'flutter/shell/platform/android:abi_jars',
              'flutter/shell/platform/android:analyze_snapshot'
          ]
      ),
  ]

  builds = []
  for aot_variant in aot_variants:
    build_out_dir = aot_variant.GetBuildOutDir()
    if build_out_dir == 'android_profile_arm64':
      continue
    props = {
        'builds': [{
            'gn_args': aot_variant.GetGNArgs(),
            'dir': build_out_dir,
            'targets': aot_variant.GetNinjaTargets(),
            'output_files': ['zip_archives', 'libflutter.so']
        }],
    }

    if 'git_url' in api.properties and 'git_ref' in api.properties:
      props['git_url'] = api.properties['git_url']
      props['git_ref'] = api.properties['git_ref']

    with api.step.nest('Schedule build %s' % build_out_dir):
      builds += ScheduleBuilds(api, 'Linux Engine Drone', props)

  checkout = GetCheckoutPath(api)
  git_rev = api.buildbucket.gitiles_commit.id or 'HEAD'

  try:
    with api.step.nest('Build and test arm64 profile'):
      BuildLinuxAndroidAOTArm64Profile(api, swarming_task_id, aot_variants[0])
  except (api.step.StepFailure, api.step.InfraFailure) as e:
    CancelBuilds(api, builds)
    raise e

  builds = CollectBuilds(api, builds)
  api.display_util.display_builds(
      step_name='display builds',
      builds=builds.values(),
      raise_on_failure=True,
  )
  for build_id in builds:
    build_props = builds[build_id].output.properties
    if 'cas_output_hash' in build_props:
      api.cas.download(
          'Download for build %s' % build_id,
          build_props['cas_output_hash'], GetCheckoutPath(api)
      )

  # Explicitly upload artifacts.

  # Artifacts.zip
  UploadArtifact(api, config='android_profile', platform='android-arm-profile',
                 artifact_name='artifacts.zip')
  UploadArtifact(api, config='android_profile_x64', platform='android-x64-profile',
                 artifact_name='artifacts.zip')
  UploadArtifact(api, config='android_profile_arm64', platform='android-arm64-profile',
                 artifact_name='artifacts.zip')

  UploadArtifact(api, config='android_release', platform='android-arm-release',
                 artifact_name='artifacts.zip')
  UploadArtifact(api, config='android_release_x64', platform='android-x64-release',
                 artifact_name='artifacts.zip')
  UploadArtifact(api, config='android_release_arm64', platform='android-arm64-release',
                 artifact_name='artifacts.zip')

  # Linux-x64.zip.
  UploadArtifact(api, config='android_profile', platform='android-arm-profile',
                 artifact_name='linux-x64.zip')
  UploadArtifact(api, config='android_profile_x64', platform='android-x64-profile',
                 artifact_name='linux-x64.zip')
  UploadArtifact(api, config='android_profile_arm64', platform='android-arm64-profile',
                 artifact_name='linux-x64.zip')

  UploadArtifact(api, config='android_release', platform='android-arm-release',
                 artifact_name='linux-x64.zip')
  UploadArtifact(api, config='android_release_x64', platform='android-x64-release',
                 artifact_name='linux-x64.zip')
  UploadArtifact(api, config='android_release_arm64', platform='android-arm64-release',
                 artifact_name='linux-x64.zip')

  # Symbols.zip
  UploadArtifact(api, config='android_profile', platform='android-arm-profile',
                 artifact_name='symbols.zip')
  UploadArtifact(api, config='android_profile_x64', platform='android-x64-profile',
                 artifact_name='symbols.zip')
  UploadArtifact(api, config='android_profile_arm64', platform='android-arm64-profile',
                 artifact_name='symbols.zip')

  UploadArtifact(api, config='android_release', platform='android-arm-release',
                 artifact_name='symbols.zip')
  UploadArtifact(api, config='android_release_x64', platform='android-x64-release',
                 artifact_name='symbols.zip')
  UploadArtifact(api, config='android_release_arm64', platform='android-arm64-release',
                 artifact_name='symbols.zip')

  # analyze-snapshot-linux-x64.zip
  UploadArtifact(api, config='android_profile_x64', platform='android-x64-profile',
                 artifact_name='analyze-snapshot-linux-x64.zip')
  UploadArtifact(api, config='android_profile_arm64', platform='android-arm64-profile',
                 artifact_name='analyze-snapshot-linux-x64.zip')

  UploadArtifact(api, config='android_release_x64', platform='android-x64-release',
                 artifact_name='analyze-snapshot-linux-x64.zip')
  UploadArtifact(api, config='android_release_arm64', platform='android-arm64-release',
                 artifact_name='analyze-snapshot-linux-x64.zip')

  # Jar, pom, embedding files.
  UploadToDownloadFlutterIO(api, 'android_profile')
  UploadToDownloadFlutterIO(api, 'android_profile_x64')
  UploadToDownloadFlutterIO(api, 'android_profile_arm64')

  UploadToDownloadFlutterIO(api, 'android_release')
  UploadToDownloadFlutterIO(api, 'android_release_x64')
  UploadToDownloadFlutterIO(api, 'android_release_arm64')

  for aot_variant in aot_variants:
    upload_dir = aot_variant.GetUploadDir()
    with api.step.nest('Upload artifacts %s' % upload_dir):
      # Paths in AndroidAotVariant do not prefix build_dir
      # that is expected when uploading artifacts.
      def prefix_build_dir(path):
        build_dir = aot_variant.GetBuildOutDir()
        return 'out/%s/%s' % (build_dir, path)

      unstripped_lib_flutter_path = prefix_build_dir(
          aot_variant.GetLibFlutterPath()
      )

      if aot_variant.GetBuildOutDir() in ['android_release_arm64', 'android_release']:
        triple = aot_variant.android_triple
        UploadTreeMap(api, upload_dir, unstripped_lib_flutter_path, triple)


def BuildLinuxAndroid(api, swarming_task_id):
  if api.properties.get('build_android_jit_release', True):
    RunGN(
        api,
        '--android',
        '--android-cpu=x86',
        '--runtime-mode=jit_release'
    )
    Build(
       api,
       'android_jit_release_x86',
       'flutter',
       'flutter/shell/platform/android:abi_jars',
       'flutter/shell/platform/android:embedding_jars',
       'flutter/shell/platform/android:robolectric_tests'
    )

    # Upload artifacts.zip
    UploadArtifact(
        api,
        config='android_jit_release_x86',
        platform='android-x86-jit-release',
        artifact_name='artifacts.zip'
    )
    RunTests(
        api,
        'android_jit_release_x86',
        android_out_dir='android_jit_release_x86',
        types='java'
    )

  if api.properties.get('build_android_debug', True):
    debug_variants = [
        AndroidAotVariant(
          android_cpu='x86',
          out_dir='android_debug_x86',
          artifact_dir='android-x86',
          clang_dir='',
          android_triple='',
          abi='x86',
          gn_args=[
              '--android',
              '--android-cpu=x86',
              '--no-lto'
          ],
          ninja_targets=[
              'flutter',
              'flutter/shell/platform/android:abi_jars',
              'flutter/shell/platform/android:robolectric_tests'
          ]
        ),
        AndroidAotVariant(
          android_cpu='x64',
          out_dir='android_debug_x64',
          artifact_dir='android-x64',
          clang_dir='',
          android_triple='',
          abi='x86_64',
          gn_args=[
              '--android',
              '--android-cpu=x64',
              '--no-lto'
          ],
          ninja_targets=[
              'flutter',
              'flutter/shell/platform/android:abi_jars'
          ]
        ),
        AndroidAotVariant(
          android_cpu='arm',
          out_dir='android_debug',
          artifact_dir='android-arm',
          clang_dir='',
          android_triple='',
          abi='armeabi_v7a',
          gn_args=[
              '--android',
              '--android-cpu=arm',
              '--no-lto'
          ],
          ninja_targets=[
              'flutter',
              'flutter/sky/dist:zip_old_location',
              'flutter/shell/platform/android:embedding_jars',
              'flutter/shell/platform/android:abi_jars'
          ]
        ),
        AndroidAotVariant(
          android_cpu='arm64',
          out_dir='android_debug_arm64',
          artifact_dir='android-arm64',
          clang_dir='',
          android_triple='',
          abi='arm64_v8a',
          gn_args=[
              '--android',
              '--android-cpu=arm64',
              '--no-lto'
          ],
          ninja_targets=[
              'flutter',
              'flutter/shell/platform/android:abi_jars'
          ]
        )
    ]
    for debug_variant in debug_variants:
      RunGN(api, *(debug_variant.GetGNArgs()))
      Build(api, debug_variant.GetBuildOutDir(), *(debug_variant.GetNinjaTargets()))

    # Run tests
    RunGN(api, '--android', '--unoptimized', '--runtime-mode=debug', '--no-lto')
    Build(api, 'android_debug', 'flutter/shell/platform/android:robolectric_tests')
    RunTests(api, 'android_debug', android_out_dir='android_debug', types='java')

    # Explicitly upload artifacts.

    # Artifacts.zip
    UploadArtifact(api, config='android_debug_x86', platform='android-x86',
                   artifact_name='artifacts.zip')
    UploadArtifact(api, config='android_debug_x64', platform='android-x64',
                   artifact_name='artifacts.zip')
    UploadArtifact(api, config='android_debug', platform='android-arm',
                   artifact_name='artifacts.zip')
    UploadArtifact(api, config='android_debug_arm64', platform='android-arm64',
                   artifact_name='artifacts.zip')

    # Symbols.zip
    UploadArtifact(api, config='android_debug_x86', platform='android-x86',
                   artifact_name='symbols.zip')
    UploadArtifact(api, config='android_debug_x64', platform='android-x64',
                   artifact_name='symbols.zip')
    UploadArtifact(api, config='android_debug', platform='android-arm',
                   artifact_name='symbols.zip')
    UploadArtifact(api, config='android_debug_arm64', platform='android-arm64',
                   artifact_name='symbols.zip')

    # Jar, pom, embedding files.
    UploadToDownloadFlutterIO(api, 'android_debug_x86')
    UploadToDownloadFlutterIO(api, 'android_debug_x64')
    UploadToDownloadFlutterIO(api, 'android_debug') #arm
    UploadToDownloadFlutterIO(api, 'android_debug_arm64')

    # Additional artifacts for android_debug
    UploadArtifact(api, config='android_debug', platform='',
                   artifact_name='sky_engine.zip')
    UploadArtifact(api, config='android_debug', platform='',
                   artifact_name='android-javadoc.zip')

    # Upload to CIPD.
    # TODO(godofredoc): Validate if this can be removed.
    UploadSkyEngineDartPackage(api)

  if api.properties.get('build_android_aot', True):
    BuildLinuxAndroidAOT(api, swarming_task_id)


def BuildLinux(api):
  checkout = GetCheckoutPath(api)
  RunGN(api, '--runtime-mode', 'debug', '--prebuilt-dart-sdk', '--build-embedder-examples')
  RunGN(api, '--runtime-mode', 'debug', '--unoptimized', '--prebuilt-dart-sdk')
  RunGN(api, '--runtime-mode', 'profile', '--no-lto', '--prebuilt-dart-sdk', '--build-embedder-examples')
  RunGN(api, '--runtime-mode', 'release', '--prebuilt-dart-sdk', '--build-embedder-examples')
  # flutter/sky/packages from host_debug_unopt is needed for RunTests 'dart'
  # type.
  Build(api, 'host_debug_unopt', 'flutter/sky/packages')
  Build(api, 'host_debug',
        'flutter/build/archives:artifacts',
        'flutter/build/archives:dart_sdk_archive',
        'flutter/build/archives:embedder',
        'flutter/build/archives:flutter_patched_sdk',
        'flutter/build/dart:copy_dart_sdk',
        'flutter/tools/font-subset',
        'flutter:unittests',
  )
  # 'engine' suite has failing tests in host_debug.
  # https://github.com/flutter/flutter/issues/103757
  RunTests(api, 'host_debug', types='dart')

  Build(api, 'host_profile',
        'flutter/shell/testing',
        'flutter/tools/path_ops',
        'flutter/build/dart:copy_dart_sdk',
        'flutter/shell/testing',
        'flutter:unittests',
  )
  RunTests(api, 'host_profile', types='dart,engine')
  Build(api, 'host_release',
        'flutter/build/archives:flutter_patched_sdk',
        'flutter/build/dart:copy_dart_sdk',
        'flutter/display_list:display_list_benchmarks',
        'flutter/display_list:display_list_builder_benchmarks',
        'flutter/fml:fml_benchmarks',
        'flutter/impeller/geometry:geometry_benchmarks',
        'flutter/lib/ui:ui_benchmarks',
        'flutter/shell/common:shell_benchmarks',
        'flutter/shell/testing',
        'flutter/third_party/txt:txt_benchmarks',
        'flutter/tools/path_ops',
        'flutter:unittests'
  )
  RunTests(api, 'host_release', types='dart,engine,benchmarks')

  # host_debug
  UploadArtifact(api, config='host_debug', platform='linux-x64',
                   artifact_name='artifacts.zip')
  UploadArtifact(api, config='host_debug', platform='linux-x64',
                   artifact_name='linux-x64-embedder.zip')
  UploadArtifact(api, config='host_debug', platform='linux-x64',
                   artifact_name='font-subset.zip')
  UploadArtifact(api, config='host_debug', platform='',
                   artifact_name='flutter_patched_sdk.zip')
  UploadArtifact(api, config='host_release', platform='',
                   artifact_name='flutter_patched_sdk_product.zip')
  UploadArtifact(api, config='host_debug', platform='',
                   artifact_name='dart-sdk-linux-x64.zip')

  # Rebuild with fontconfig support enabled for the desktop embedding, since it
  # should be on for libflutter_linux_gtk.so, but not libflutter_engine.so.
  RunGN(api, '--runtime-mode', 'debug', '--enable-fontconfig', '--prebuilt-dart-sdk')
  RunGN(api, '--runtime-mode', 'profile', '--no-lto', '--enable-fontconfig', '--prebuilt-dart-sdk')
  RunGN(api, '--runtime-mode', 'release', '--enable-fontconfig', '--prebuilt-dart-sdk')

  Build(api, 'host_debug', 'flutter/shell/platform/linux:flutter_gtk')
  Build(api, 'host_profile', 'flutter/shell/platform/linux:flutter_gtk')
  Build(api, 'host_release', 'flutter/shell/platform/linux:flutter_gtk')

  UploadArtifact(api, config='host_debug', platform='linux-x64-debug',
                 artifact_name='linux-x64-flutter-gtk.zip')
  UploadArtifact(api, config='host_profile', platform='linux-x64-profile',
                 artifact_name='linux-x64-flutter-gtk.zip')
  UploadArtifact(api, config='host_release', platform='linux-x64-release',
                 artifact_name='linux-x64-flutter-gtk.zip')


def GetRemoteFileName(exec_path):
  # An example of exec_path is:
  # out/fuchsia_debug_x64/flutter-fuchsia-x64/d4/917f5976.debug
  # In the above example "d4917f5976" is the elf BuildID for the
  # executable. First 2 characters are used as the directory name
  # and the rest of the string is the name of the unstripped executable.
  parts = exec_path.split('/')
  # We want d4917f5976.debug as the result.
  return ''.join(parts[-2:])


def UploadFuchsiaDebugSymbolsToSymbolServer(api, arch, symbol_dirs):
  """Uploads debug symbols to the Fuchsia Symbol Server (GCS bucket)

  Parameters
  ----------
  api : recipe API object.
  arch: architecture of the executable, typically x64 or arm64.
  symbol_dirs: dirs where the executables were generated.
  """
  with api.step.nest('Upload to Symbol Server for arch: %s' % arch):
    for symbol_dir in symbol_dirs:
      executables = api.file.listdir(
          'list %s' % symbol_dir,
          symbol_dir,
          recursive=True,
          test_data=['test_dir/sub_dir/test_file.debug']
      )
      # TODO(kaushikiska): Upload all the binaries as one gsutil copy
      # rather than doing it file by file.
      for executable in executables:
        # if a file contains 'dbg_success' in its name, it is a stamp file.
        # An example of this would be
        # '._dart_jit_runner_dbg_symbols_unstripped_dbg_success' these
        # are generated by GN and have to be ignored.
        exec_path = str(executable)
        if 'dbg_success' not in exec_path:
          remote_file_name = GetRemoteFileName(exec_path)
          api.bucket_util.safe_upload(
              executable,
              '%s/%s' % (FUCHSIA_ARTIFACTS_DEBUG_NAMESPACE, remote_file_name),
              bucket_name=FUCHSIA_ARTIFACTS_BUCKET_NAME,
              args=['-n'],
              skip_on_duplicate=True,  # because this isn't namespaced by commit
          )


def UploadFuchsiaDebugSymbolsToCIPD(api, arch, symbol_dirs, upload):
  checkout = GetCheckoutPath(api)
  dbg_symbols_script = str(
      checkout.join('flutter/tools/fuchsia/merge_and_upload_debug_symbols.py')
  )
  git_rev = api.buildbucket.gitiles_commit.id or 'HEAD'
  with api.os_utils.make_temp_directory('FuchsiaDebugSymbols_%s' % arch
                                       ) as temp_dir:
    debug_symbols_cmd = [
        'python3', dbg_symbols_script, '--engine-version', git_rev
    ]
    if upload:
      debug_symbols_cmd += ['--upload']
    debug_symbols_cmd += [
        '--target-arch', arch, '--out-dir', temp_dir, '--symbol-dirs'
    ] + symbol_dirs
    api.step('Upload to CIPD for arch: %s' % arch, cmd=debug_symbols_cmd, infra_step=True)


def UploadFuchsiaDebugSymbols(api, upload):
  checkout = GetCheckoutPath(api)
  archs = ['arm64', 'x64']
  modes = ['debug', 'profile', 'release']

  arch_to_symbol_dirs = {}
  for arch in archs:
    symbol_dirs = []
    for mode in modes:
      out_dir = 'fuchsia_%s_%s' % (mode, arch)
      symbol_dir = checkout.join('out', out_dir, '.build-id')
      symbol_dirs.append(symbol_dir)
    arch_to_symbol_dirs[arch] = symbol_dirs

  debug_symbol_futures = []
  for arch in archs:
    symbol_dirs = arch_to_symbol_dirs[arch]
    sym_server_future = api.futures.spawn(
        UploadFuchsiaDebugSymbolsToSymbolServer, api, arch, symbol_dirs
    )
    debug_symbol_futures.append(sym_server_future)
    cipd_future = api.futures.spawn(
        UploadFuchsiaDebugSymbolsToCIPD, api, arch, symbol_dirs, upload
    )
    debug_symbol_futures.append(cipd_future)

  for debug_sym_future in api.futures.iwait(debug_symbol_futures):
    debug_sym_future.result()


def ShouldPublishToCIPD(api, package_name, git_rev):
  """
  CIPD will, upon request, tag multiple instances with the same tag. However, if
  you try to retrieve that tag, it will throw an error complaining that the tag
  amgiguously refers to multiple instances. We should check before tagging.
  """
  instances = api.cipd.search(package_name, "git_revision:%s" % git_rev)
  return len(instances) == 0


def BuildFuchsia(api, gclient_vars):
  """
  This schedules release and profile builds for x64 and arm64 on other bots,
  and then builds the x64 and arm64 runners (which do not require LTO and thus
  are faster to build). On Linux, we also run tests for the runner against x64,
  and if they fail we cancel the scheduled builds.

  Args:
    gclient_vars: A dictionary with gclient variable names as keys and their
      associated values as the dictionary values.
  """
  fuchsia_build_pairs = [
      ('arm64', 'profile'),
      ('arm64', 'release'),
      ('x64', 'profile'),
      ('x64', 'release'),
  ]
  builds = []

  for arch, build_mode in fuchsia_build_pairs:
    gn_args = ['--fuchsia', '--fuchsia-cpu', arch, '--runtime-mode', build_mode]
    product = build_mode == 'release'
    fuchsia_output_dirs = GetFuchsiaOutputDirs(product)
    props = {
        'builds': [{
            'gn_args': gn_args,
            'dir': 'fuchsia_%s_%s' % (build_mode, arch),
            'targets': GetFlutterFuchsiaBuildTargets(product),
            'output_files': GetFuchsiaOutputFiles(product),
            'output_dirs': fuchsia_output_dirs,
        }],
        'gclient_variables': gclient_vars,
    }
    if 'git_url' in api.properties and 'git_ref' in api.properties:
      props['git_url'] = api.properties['git_url']
      props['git_ref'] = api.properties['git_ref']
    builds += ScheduleBuilds(api, 'Linux Engine Drone', props)

  checkout = GetCheckoutPath(api)
  build_script = str(
      checkout.join('flutter/tools/fuchsia/build_fuchsia_artifacts.py')
  )
  git_rev = api.buildbucket.gitiles_commit.id or 'HEAD'

  try:
    BuildAndPackageFuchsia(api, build_script, git_rev)
  except (api.step.StepFailure, api.step.InfraFailure) as e:
    CancelBuilds(api, builds)
    raise e

  builds = CollectBuilds(api, builds)
  api.display_util.display_builds(
      step_name='display builds',
      builds=builds.values(),
      raise_on_failure=True,
  )
  for build_id in builds:
    build_props = builds[build_id].output.properties
    if 'cas_output_hash' in build_props:
      api.cas.download(
          'Download for build %s' % build_id,
          build_props['cas_output_hash'], GetCheckoutPath(api)
      )

  fuchsia_package_cmd = [
      'python3',
      build_script,
      '--engine-version',
      git_rev,
      '--skip-build',
  ]

  upload = (api.bucket_util.should_upload_packages() and
      not api.runtime.is_experimental and
      ShouldPublishToCIPD(api, 'flutter/fuchsia', git_rev))

  if upload:
    fuchsia_package_cmd += ['--upload']

  api.step('Upload Fuchsia Artifacts', fuchsia_package_cmd, infra_step=True)
  with api.step.nest('Upload Fuchsia Debug Symbols'):
    UploadFuchsiaDebugSymbols(api, upload)


@contextmanager
def SetupXcode(api):
  # See cr-buildbucket.cfg for how the version is passed in.
  # https://github.com/flutter/infra/blob/35f51ea4bfc91966b41d988f6028e34449aa4279/config/generated/flutter/luci/cr-buildbucket.cfg#L7176-L7203
  with api.osx_sdk('ios'):
    yield


def PackageMacOSVariant(
    api,
    label,
    arm64_out,
    x64_out,
    bucket_name,
):
  checkout = GetCheckoutPath(api)
  out_dir = checkout.join('out')

  # Package the multi-arch framework for macOS.
  label_dir = out_dir.join(label)
  create_macos_framework_cmd = [
      checkout.join('flutter/sky/tools/create_macos_framework.py'),
      '--dst',
      label_dir,
      '--arm64-out-dir',
      api.path.join(out_dir, arm64_out),
      '--x64-out-dir',
      api.path.join(out_dir, x64_out),
  ]
  if label == 'release':
    create_macos_framework_cmd.extend([
        "--dsym",
        "--strip",
    ])

  with api.context(cwd=checkout):
    api.step(
        'Create macOS %s FlutterMacOS.framework' % label,
        create_macos_framework_cmd
    )

  # Package the multi-arch gen_snapshot for macOS.
  create_macos_gen_snapshot_cmd = [
      checkout.join('flutter/sky/tools/create_macos_gen_snapshots.py'),
      '--dst',
      label_dir,
      '--arm64-out-dir',
      api.path.join(out_dir, arm64_out),
      '--x64-out-dir',
      api.path.join(out_dir, x64_out),
  ]

  with api.context(cwd=checkout):
    api.step(
        'Create macOS %s gen_snapshot' % label,
        create_macos_gen_snapshot_cmd
    )

  api.zip.directory(
      'Archive FlutterMacOS.framework',
      label_dir.join('FlutterMacOS.framework'),
      label_dir.join('FlutterMacOS.framework.zip')
  )

  UploadArtifacts(
      api, bucket_name, [
          'out/%s/FlutterMacOS.framework.zip' % label,
      ],
      archive_name='FlutterMacOS.framework.zip'
  )
  UploadArtifacts(
      api, bucket_name, [
          'out/%s/gen_snapshot_x64' % label,
          'out/%s/gen_snapshot_arm64' % label,
      ],
      archive_name='gen_snapshot.zip'
  )

  if label == 'release':
    api.zip.directory(
        'Archive FlutterMacOS.dSYM',
        label_dir.join('FlutterMacOS.dSYM'),
        label_dir.join('FlutterMacOS.dSYM.zip')
    )
    UploadArtifacts(
        api, bucket_name, [
            'out/%s/FlutterMacOS.dSYM.zip' % label,
        ],
        archive_name='FlutterMacOS.dSYM.zip'
    )


def BuildMac(api):
  if api.properties.get('build_host', True):
    # Host Debug x64
    RunGN(
        api,
        '--runtime-mode',
        'debug',
        '--no-lto',
        '--prebuilt-dart-sdk',
        '--build-embedder-examples'
    )
    Build(
        api,
        'host_debug',
        'flutter/build/archives:archive_gen_snapshot',
        'flutter/build/archives:artifacts',
        'flutter/build/archives:dart_sdk_archive',
        'flutter/build/archives:flutter_embedder_framework',
        'flutter/build/dart:copy_dart_sdk',
        'flutter/shell/platform/darwin/macos:zip_macos_flutter_framework',
        'flutter/tools/font-subset',
        'flutter:unittests'
    )
    RunTests(api, 'host_debug', types='dart')

    # Host Profile x64
    RunGN(
        api,
        '--runtime-mode',
        'profile', '--no-lto',
        '--prebuilt-dart-sdk',
        '--build-embedder-examples'
    )
    Build(
        api,
        'host_profile',
        'flutter/build/archives:archive_gen_snapshot',
        'flutter/build/archives:artifacts',
        'flutter/build/dart:copy_dart_sdk',
        'flutter/shell/platform/darwin/macos:zip_macos_flutter_framework',
        'flutter:unittests'
    )
    RunTests(api, 'host_profile', types='dart,engine')

    # Host release x64
    RunGN(
        api,
        '--runtime-mode',
        'release',
        '--no-lto',
        '--prebuilt-dart-sdk',
        '--build-embedder-examples'
    )
    Build(
        api,
        'host_release',
        'flutter/build/archives:archive_gen_snapshot',
        'flutter/build/archives:artifacts',
        'flutter/build/dart:copy_dart_sdk',
        'flutter/shell/platform/darwin/macos:zip_macos_flutter_framework',
        'flutter:unittests'
    )
    RunTests(api, 'host_release', types='dart,engine')

    # Host debug arm64
    RunGN(
        api,
        '--mac',
        '--mac-cpu',
        'arm64',
        '--runtime-mode',
        'debug',
        '--no-lto',
        '--prebuilt-dart-sdk'
    )
    Build(
        api,
        'mac_debug_arm64',
        'flutter/build/archives:archive_gen_snapshot',
        'flutter/build/archives:artifacts',
        'flutter/build/archives:dart_sdk_archive',
        'flutter/shell/platform/darwin/macos:zip_macos_flutter_framework',
        'flutter/tools/font-subset'
    )

    # Host profile arm64
    RunGN(
        api,
        '--mac',
        '--mac-cpu',
        'arm64',
        '--runtime-mode',
        'profile',
        '--no-lto',
        '--prebuilt-dart-sdk'
    )
    Build(
        api,
        'mac_profile_arm64',
        'flutter/build/archives:artifacts',
        'flutter/shell/platform/darwin/macos:zip_macos_flutter_framework'
    )

    # Host release arm64
    RunGN(
        api,
        '--mac',
        '--mac-cpu',
        'arm64',
        '--runtime-mode',
        'release',
        '--no-lto',
        '--prebuilt-dart-sdk'
    )
    Build(
        api,
        'mac_release_arm64',
        'flutter/build/archives:artifacts',
        'flutter/shell/platform/darwin/macos:zip_macos_flutter_framework'
    )

    # Artifact uploads.
    # Host Debug x64
    UploadArtifact(
        api,
        config='host_debug',
        platform='darwin-x64',
        artifact_name='artifacts.zip'
    )
    UploadArtifact(
        api,
        config='host_debug',
        platform='darwin-x64',
        artifact_name='FlutterEmbedder.framework.zip'
    )
    UploadArtifact(
        api,
        config='host_debug',
        platform='',
        artifact_name='dart-sdk-darwin-x64.zip'
    )
    UploadArtifact(
        api,
        config='host_debug',
        platform='darwin-x64',
        artifact_name='font-subset.zip'
    )

    # Host Profile x64
    UploadArtifact(
        api,
        config='host_profile',
        platform='darwin-x64-profile',
        artifact_name='artifacts.zip'
    )

    # Host release x64
    UploadArtifact(
        api,
        config='host_release',
        platform='darwin-x64-release',
        artifact_name='artifacts.zip'
    )

    # Host debug arm64
    UploadArtifact(
        api,
        config='mac_debug_arm64',
        platform='darwin-arm64',
        artifact_name='artifacts.zip'
    )
    UploadArtifact(
        api,
        config='mac_debug_arm64',
        platform='',
        artifact_name='dart-sdk-darwin-arm64.zip'
    )
    UploadArtifact(
        api,
        config='mac_debug_arm64',
        platform='darwin-arm64',
        artifact_name='font-subset.zip'
    )

    # Host profile arm64
    UploadArtifact(
        api,
        config='mac_profile_arm64',
        platform='darwin-arm64-profile',
        artifact_name='artifacts.zip'
    )

    # Host release arm64
    UploadArtifact(
        api,
        config='mac_release_arm64',
        platform='darwin-arm64-release',
        artifact_name='artifacts.zip'
    )

    # These artifacts will translate to global generators.
    PackageMacOSVariant(
        api, 'debug', 'mac_debug_arm64', 'host_debug', 'darwin-x64'
    )
    PackageMacOSVariant(
        api, 'profile', 'mac_profile_arm64', 'host_profile', 'darwin-x64-profile'
    )
    PackageMacOSVariant(
        api, 'release', 'mac_release_arm64', 'host_release', 'darwin-x64-release'
    )


  if api.properties.get('build_android_aot', True):
    # Profile arm
    RunGN(
        api,
        '--runtime-mode',
        'profile',
        '--android'
    )
    Build(
        api,
        'android_profile',
        'flutter/lib/snapshot',
        'flutter/shell/platform/android:gen_snapshot'
    )
    UploadArtifact(
        api,
        config='android_profile',
        platform='android-arm-profile',
        artifact_name='darwin-x64.zip'
    )

    # Profile arm64
    RunGN(
        api,
        '--runtime-mode',
        'profile',
        '--android',
        '--android-cpu=arm64'
    )
    Build(
        api,
        'android_profile_arm64',
        'flutter/lib/snapshot',
        'flutter/shell/platform/android:gen_snapshot'
    )
    UploadArtifact(
        api,
        config='android_profile_arm64',
        platform='android-arm64-profile',
        artifact_name='darwin-x64.zip'
    )

    # Profile x64
    RunGN(
        api,
        '--runtime-mode',
        'profile',
        '--android',
        '--android-cpu=x64'
    )
    Build(
        api,
        'android_profile_x64',
        'flutter/lib/snapshot',
        'flutter/shell/platform/android:gen_snapshot'
    )
    UploadArtifact(
        api,
        config='android_profile_x64',
        platform='android-x64-profile',
        artifact_name='darwin-x64.zip'
    )

    # Release arm
    RunGN(
        api,
        '--runtime-mode',
        'release',
        '--android'
    )
    Build(
        api,
        'android_release',
        'flutter/lib/snapshot',
        'flutter/shell/platform/android:gen_snapshot'
    )
    UploadArtifact(
        api,
        config='android_release',
        platform='android-arm-release',
        artifact_name='darwin-x64.zip'
    )

    # Release arm64
    RunGN(
        api,
        '--runtime-mode',
        'release',
        '--android',
        '--android-cpu=arm64'
    )
    Build(
        api,
        'android_release_arm64',
        'flutter/lib/snapshot',
        'flutter/shell/platform/android:gen_snapshot'
    )
    UploadArtifact(
        api,
        config='android_release_arm64',
        platform='android-arm64-release',
        artifact_name='darwin-x64.zip'
    )

    # Release x64
    RunGN(
        api,
        '--runtime-mode',
        'release',
        '--android',
        '--android-cpu=x64'
    )
    Build(
        api,
        'android_release_x64',
        'flutter/lib/snapshot',
        'flutter/shell/platform/android:gen_snapshot'

    )
    UploadArtifact(
        api,
        config='android_release_x64',
        platform='android-x64-release',
        artifact_name='darwin-x64.zip'
    )


def PackageIOSVariant(
    api,
    label,
    arm64_out,
    sim_x64_out,
    sim_arm64_out,
    bucket_name,
):
  checkout = GetCheckoutPath(api)
  out_dir = checkout.join('out')

  # Package the multi-arch framework for iOS.
  label_dir = out_dir.join(label)
  create_ios_framework_cmd = [
      checkout.join('flutter/sky/tools/create_ios_framework.py'),
      '--dst',
      label_dir,
      '--arm64-out-dir',
      api.path.join(out_dir, arm64_out),
      '--simulator-x64-out-dir',
      api.path.join(out_dir, sim_x64_out),
      '--simulator-arm64-out-dir',
      api.path.join(out_dir, sim_arm64_out),
  ]

  if label == 'release':
    create_ios_framework_cmd.extend([
        "--dsym",
        "--strip",
    ])
  with api.context(cwd=checkout):
    api.step(
        'Create iOS %s Flutter.xcframework' % label, create_ios_framework_cmd
    )

  # Package the multi-arch gen_snapshot for macOS.
  create_macos_gen_snapshot_cmd = [
      checkout.join('flutter/sky/tools/create_macos_gen_snapshots.py'),
      '--dst',
      label_dir,
      '--arm64-out-dir',
      api.path.join(out_dir, arm64_out),
  ]

  with api.context(cwd=checkout):
    api.step(
        'Create macOS %s gen_snapshot' % label, create_macos_gen_snapshot_cmd
    )

  # Upload the artifacts to cloud storage.
  file_artifacts = [
      'gen_snapshot_arm64',
  ]
  directory_artifacts = [
      'Flutter.xcframework',
  ]

  label_root = checkout.join('out', label)
  UploadArtifacts(
      api,
      bucket_name,
      file_artifacts,
      directory_artifacts,
      pkg_root=label_root
  )

  if label == 'release':
    dsym_zip = label_dir.join('Flutter.dSYM.zip')
    pkg = api.zip.make_package(label_dir, dsym_zip)
    pkg.add_directory(label_dir.join('Flutter.dSYM'))
    pkg.zip('Zip Flutter.dSYM')
    remote_name = '%s/Flutter.dSYM.zip' % bucket_name
    remote_zip = GetCloudPath(api, remote_name)
    api.bucket_util.safe_upload(dsym_zip, remote_zip)


def BuildIOS(api, env, env_prefixes):
  # Simulator binary is needed in all runtime modes.
  RunGN(api, '--ios', '--runtime-mode', 'debug', '--simulator', '--no-lto')
  Build(api, 'ios_debug_sim')

  # The impellerc that was built as part of ios_debug_sim is used as a
  # prebuilt to the builds below in order to reduce build times. This is
  # not the impellerc that is shipped, so the exact details of how it is
  # built (e.g. --no-lto) don't matter.
  checkout = GetCheckoutPath(api)
  out_dir = checkout.join('out')
  impellerc_path = api.path.join(
      out_dir, 'ios_debug_sim', 'clang_x64', 'impellerc'
  )

  RunGN(
      api, '--ios', '--runtime-mode', 'debug', '--simulator',
      '--simulator-cpu=arm64', '--no-lto',
      '--prebuilt-impellerc', impellerc_path
  )
  Build(api, 'ios_debug_sim_arm64')

  if api.properties.get('ios_debug', True):
    RunGN(
        api, '--ios', '--runtime-mode', 'debug',
        '--prebuilt-impellerc', impellerc_path
    )
    Build(api, 'ios_debug')

    BuildObjcDoc(api, env, env_prefixes)

    PackageIOSVariant(
        api, 'debug', 'ios_debug', 'ios_debug_sim',
        'ios_debug_sim_arm64', 'ios'
    )

  if api.properties.get('ios_profile', True):
    RunGN(
        api, '--ios', '--runtime-mode', 'profile',
        '--prebuilt-impellerc', impellerc_path
    )
    Build(api, 'ios_profile')

    PackageIOSVariant(
        api, 'profile', 'ios_profile', 'ios_debug_sim',
        'ios_debug_sim_arm64', 'ios-profile'
    )

  if api.properties.get('ios_release', True):
    RunGN(
        api, '--ios', '--runtime-mode', 'release',
        '--prebuilt-impellerc', impellerc_path
    )
    Build(api, 'ios_release')

    PackageIOSVariant(
        api, 'release', 'ios_release', 'ios_debug_sim',
        'ios_debug_sim_arm64', 'ios-release'
    )


def BuildWindows(api):
  if api.properties.get('build_host', True):
    RunGN(api, '--runtime-mode', 'debug', '--no-lto', '--prebuilt-dart-sdk')
    Build(api, 'host_debug', 'flutter:unittests', 'flutter/build/archives:artifacts',
          'flutter/build/archives:embedder', 'flutter/tools/font-subset',
          'flutter/build/archives:dart_sdk_archive',
          'flutter/shell/platform/windows/client_wrapper:client_wrapper_archive',
          'flutter/build/archives:windows_flutter'
    )
    RunTests(api, 'host_debug', types='engine')
    RunGN(api, '--runtime-mode', 'profile', '--no-lto', '--prebuilt-dart-sdk')
    Build(api, 'host_profile', 'windows', 'flutter:gen_snapshot', 'flutter/build/archives:windows_flutter')
    RunGN(api, '--runtime-mode', 'release', '--no-lto', '--prebuilt-dart-sdk')
    Build(api, 'host_release', 'windows', 'flutter:gen_snapshot', 'flutter/build/archives:windows_flutter')

    branch = api.properties.get('git_branch', None)
    if branch == 'main':
      RunGN(api, '--runtime-mode', 'debug', '--no-lto', '--prebuilt-dart-sdk',
            '--windows-cpu', 'arm64')
      Build(api, 'host_debug_arm64', 'flutter/build/archives:artifacts',
            'flutter/build/archives:embedder', 'flutter/tools/font-subset',
            'flutter/build/archives:dart_sdk_archive',
            'flutter/shell/platform/windows/client_wrapper:client_wrapper_archive',
            'flutter/build/archives:windows_flutter')
      RunGN(api, '--runtime-mode', 'profile', '--no-lto', '--prebuilt-dart-sdk',
            '--windows-cpu', 'arm64')
      Build(api, 'host_profile_arm64', 'windows', 'gen_snapshot',
            'flutter/build/archives:windows_flutter')
      RunGN(api, '--runtime-mode', 'release', '--no-lto', '--prebuilt-dart-sdk',
            '--windows-cpu', 'arm64')
      Build(api, 'host_release_arm64', 'windows', 'gen_snapshot',
          'flutter/build/archives:windows_flutter')

    api.file.listdir(
        'host_release zips',
        GetCheckoutPath(api).join('out', 'host_release', 'zip_archives'))


    # host_debug
    UploadArtifact(api, config='host_debug', platform='windows-x64',
                   artifact_name='artifacts.zip')
    UploadArtifact(api, config='host_debug', platform='windows-x64',
                   artifact_name='windows-x64-embedder.zip')
    UploadArtifact(api, config='host_debug', platform='windows-x64-debug',
                   artifact_name='windows-x64-flutter.zip')
    UploadArtifact(api, config='host_debug', platform='windows-x64',
                   artifact_name='flutter-cpp-client-wrapper.zip')
    UploadArtifact(api, config='host_debug', platform='windows-x64',
                   artifact_name='font-subset.zip')
    UploadArtifact(api, config='host_debug', platform='',
                   artifact_name='dart-sdk-windows-x64.zip')

    # Host_profile
    UploadArtifact(api, config='host_profile', platform='windows-x64-profile',
                   artifact_name='windows-x64-flutter.zip')

    # Host_release
    UploadArtifact(api, config='host_release', platform='windows-x64-release',
                   artifact_name='windows-x64-flutter.zip')

    if branch == 'main':
      # host_debug_arm64.
      UploadArtifact(api, config='host_debug_arm64', platform='windows-arm64',
                     artifact_name='artifacts.zip')
      UploadArtifact(api, config='host_debug_arm64', platform='windows-arm64',
                     artifact_name='windows-arm64-embedder.zip')
      UploadArtifact(api, config='host_debug_arm64', platform='windows-arm64-debug',
                     artifact_name='windows-arm64-flutter.zip')
      UploadArtifact(api, config='host_debug_arm64', platform='windows-arm64',
                     artifact_name='flutter-cpp-client-wrapper.zip')
      UploadArtifact(api, config='host_debug_arm64', platform='',
                     artifact_name='dart-sdk-windows-arm64.zip')
      UploadArtifact(api, config='host_debug_arm64', platform='windows-arm64',
                     artifact_name='font-subset.zip')
      # host_profile_arm64.
      UploadArtifact(api, config='host_profile_arm64', platform='windows-arm64-profile',
                     artifact_name='windows-arm64-flutter.zip')
      # host_release_arm64.
      UploadArtifact(api, config='host_release_arm64', platform='windows-arm64-release',
                     artifact_name='windows-arm64-flutter.zip')

  if api.properties.get('build_android_aot', True):
    RunGN(api, '--runtime-mode', 'profile', '--android')
    RunGN(api, '--runtime-mode', 'profile', '--android', '--android-cpu=arm64')
    RunGN(api, '--runtime-mode', 'profile', '--android', '--android-cpu=x64')

    RunGN(api, '--runtime-mode', 'release', '--android')
    RunGN(api, '--runtime-mode', 'release', '--android', '--android-cpu=arm64')
    RunGN(api, '--runtime-mode', 'release', '--android', '--android-cpu=x64')

    Build(api, 'android_profile', 'flutter/build/archives:archive_win_gen_snapshot')
    Build(api, 'android_profile_arm64', 'flutter/build/archives:archive_win_gen_snapshot')
    Build(api, 'android_profile_x64', 'flutter/build/archives:archive_win_gen_snapshot')
    Build(api, 'android_release', 'flutter/build/archives:archive_win_gen_snapshot')
    Build(api, 'android_release_arm64', 'flutter/build/archives:archive_win_gen_snapshot')
    Build(api, 'android_release_x64', 'flutter/build/archives:archive_win_gen_snapshot')
    UploadArtifact(api, config='android_profile', platform='android-arm-profile',
                   artifact_name='windows-x64.zip')
    UploadArtifact(api, config='android_profile_arm64', platform='android-arm64-profile',
                   artifact_name='windows-x64.zip')
    UploadArtifact(api, config='android_profile_x64', platform='android-x64-profile',
                   artifact_name='windows-x64.zip')
    UploadArtifact(api, config='android_release', platform='android-arm-release',
                   artifact_name='windows-x64.zip')
    UploadArtifact(api, config='android_release_arm64', platform='android-arm64-release',
                   artifact_name='windows-x64.zip')
    UploadArtifact(api, config='android_release_x64', platform='android-x64-release',
                   artifact_name='windows-x64.zip')


def BuildObjcDoc(api, env, env_prefixes):
  """Builds documentation for the Objective-C variant of engine."""
  api.flutter_deps.jazzy(env, env_prefixes)
  checkout = GetCheckoutPath(api)
  with api.os_utils.make_temp_directory('BuildObjcDoc') as temp_dir:
    objcdoc_cmd = [checkout.join('flutter/tools/gen_objcdoc.sh'), temp_dir]
    with api.context(env=env, env_prefixes=env_prefixes, cwd=checkout.join('flutter')):
      api.step('build obj-c doc', objcdoc_cmd)
    api.zip.directory(
        'archive obj-c doc', temp_dir, checkout.join('out/ios-objcdoc.zip')
    )

    api.bucket_util.safe_upload(
        checkout.join('out/ios-objcdoc.zip'),
        GetCloudPath(api, 'ios-objcdoc.zip')
    )


def RunSteps(api, properties, env_properties):
  # Collect memory/cpu/process before task execution.
  api.os_utils.collect_os_info()

  cache_root = api.path['cache'].join('builder')
  checkout = GetCheckoutPath(api)

  api.file.rmtree('Clobber build output', checkout.join('out'))

  api.file.ensure_directory('Ensure checkout cache', cache_root)
  dart_bin = checkout.join(
      'third_party', 'dart', 'tools', 'sdks', 'dart-sdk', 'bin'
  )

  android_home = checkout.join('third_party', 'android_tools', 'sdk')

  env = {
    'ANDROID_HOME': str(android_home),
  }

  use_prebuilt_dart = (api.properties.get('build_host', True) or
                       api.properties.get('build_android_aot', True))

  if use_prebuilt_dart:
    env['FLUTTER_PREBUILT_DART_SDK'] = 'True'

  env_prefixes = {'PATH': [dart_bin]}

  api.logs_util.initialize_logs_collection(env)

  # Add certificates and print the ones required for pub.
  api.flutter_deps.certs(env, env_prefixes)
  api.os_utils.print_pub_certs()

  # Enable long path support on Windows.
  api.os_utils.enable_long_paths()
  api.repo_util.engine_checkout(cache_root, env, env_prefixes)

  # Delete derived data on mac. This is a noop for other platforms.
  api.os_utils.clean_derived_data()

  # Ensure required deps are installed
  api.flutter_deps.required_deps(
      env, env_prefixes, api.properties.get('dependencies', {})
  )

  # Various scripts we run assume access to depot_tools on path for `ninja`.
  with api.context(cwd=cache_root, env=env,
                   env_prefixes=env_prefixes), api.depot_tools.on_path():

    api.gclient.runhooks()
    gclient_vars = api.shard_util_v2.unfreeze_dict(api.properties.get('gclient_variables', {}))

    try:
      if api.platform.is_linux:
        if api.properties.get('build_host', True):
          BuildLinux(api)
        if env_properties.SKIP_ANDROID != 'TRUE':
          BuildLinuxAndroid(api, env_properties.SWARMING_TASK_ID)
        if api.properties.get('build_fuchsia', True):
          BuildFuchsia(api, gclient_vars)
        VerifyExportedSymbols(api)

      if api.platform.is_mac:
        with SetupXcode(api):
          BuildMac(api)
          if api.properties.get('build_ios', True):
            BuildIOS(api, env, env_prefixes)
          if api.properties.get('build_fuchsia', True):
            BuildFuchsia(api, gclient_vars)
          VerifyExportedSymbols(api)

      if api.platform.is_win:
        BuildWindows(api)
    finally:
      api.logs_util.upload_logs('engine')
      # This is to clean up leaked processes.
      api.os_utils.kill_processes()

  # Collect memory/cpu/process after task execution.
  api.os_utils.collect_os_info()


# pylint: disable=line-too-long
# See https://chromium.googlesource.com/infra/luci/recipes-py/+/refs/heads/master/doc/user_guide.md
# The tests in here make sure that every line of code is used and does not fail.
# pylint: enable=line-too-long
def GenTests(api):
  git_revision = 'abcd1234'
  output_props = struct_pb2.Struct()
  output_props['cas_output_hash'] = 'deadbeef'
  build = api.buildbucket.try_build_message(
      builder='Linux Drone', project='flutter'
  )
  build.output.CopyFrom(build_pb2.Build.Output(properties=output_props))
  collect_build_output = api.buildbucket.simulated_collect_output([build])
  for platform in ('mac', 'linux', 'win'):
    for should_upload in (True, False):
      for maven in (True, False):
        for should_publish_cipd in (True, False):
          for no_lto in (True, False):
            for font_subset in (True, False):
              for bucket in ('prod', 'staging', 'flutter'):
                for branch in ('main', 'flutter-3.8-candidate.10'):
                  if maven and platform in ['mac', 'win']:
                    continue
                  test = api.test(
                      '%s%s%s%s%s%s_%s_%s' % (
                          platform, '_upload' if should_upload else '',
                          '_maven' if maven else '', '_publish_cipd'
                          if should_publish_cipd else '', '_no_lto' if no_lto else '',
                          '_font_subset' if font_subset else '',
                          bucket,
                          branch
                      ),
                      api.platform(platform, 64),
                      api.buildbucket.ci_build(
                          builder='%s Engine' % platform.capitalize(),
                          git_repo=GIT_REPO,
                          project='flutter',
                          revision='%s' % git_revision,
                          bucket=bucket,
                      ),
                      api.runtime(is_experimental=False),
                      api.properties(
                          **{
                              'clobber': False,
                              'goma_jobs': '1024',
                              'fuchsia_ctl_version': 'version:0.0.2',
                              'build_host': True,
                              'build_fuchsia': True,
                              'build_android_aot': True,
                              'build_android_debug': True,
                              'git_branch': branch,
                              'no_maven': maven,
                              'upload_packages': should_upload,
                              'force_upload': True,
                              'no_lto': no_lto,
                              'build_font_subset': font_subset,
                          }
                      ),
                      api.properties.environ(
                          EnvProperties(SWARMING_TASK_ID='deadbeef')
                      ),
                  )
                  if platform == 'linux' and should_upload:
                    instances = 0 if should_publish_cipd else 1
                    test += (
                        api.override_step_data(
                            'cipd search flutter/fuchsia git_revision:%s' %
                            git_revision,
                            api.cipd.example_search(
                                'flutter/fuchsia', instances=instances
                            )
                        )
                    )
                  if platform != 'win':
                    test += collect_build_output
                  if platform == 'mac':
                    test += (
                        api.properties(
                            **{
                                'jazzy_version': '0.8.4',
                                'build_ios': True,
                                'ios_debug': True,
                                'ios_profile': True,
                                'ios_release': True,
                            }
                        )
                    )
                  yield test

  for should_upload in (True, False):
    yield api.test(
        'experimental%s' % ('_upload' if should_upload else ''),
        api.buildbucket.ci_build(
            builder='Linux Engine',
            git_repo=GIT_REPO,
            project='flutter',
        ),
        collect_build_output,
        api.runtime(is_experimental=True),
        api.properties(
            **{
                'goma_jobs': '1024',
                'fuchsia_ctl_version': 'version:0.0.2',
                'android_sdk_license': 'android_sdk_hash',
                'android_sdk_preview_license': 'android_sdk_preview_hash',
                'upload_packages': should_upload,
            }
        ),
    )
  yield api.test(
      'clobber',
      api.buildbucket.ci_build(
          builder='Linux Host Engine',
          git_repo='https://github.com/flutter/engine',
          project='flutter'
      ),
      collect_build_output,
      api.runtime(is_experimental=True),
      api.properties(
          **{
              'clobber': True,
              'git_url': 'https://github.com/flutter/engine',
              'goma_jobs': '200',
              'git_ref': 'refs/pull/1/head',
              'fuchsia_ctl_version': 'version:0.0.2',
              'build_host': True,
              'build_fuchsia': True,
              'build_android_aot': True,
              'build_android_debug': True,
              'android_sdk_license': 'android_sdk_hash',
              'android_sdk_preview_license': 'android_sdk_preview_hash'
          }
      ),
  )
  yield api.test(
      'pull_request',
      api.buildbucket.ci_build(
          builder='Linux Host Engine',
          git_repo='https://github.com/flutter/engine',
          project='flutter'
      ),
      collect_build_output,
      api.runtime(is_experimental=True),
      api.properties(
          **{
              'clobber': False,
              'git_url': 'https://github.com/flutter/engine',
              'goma_jobs': '200',
              'git_ref': 'refs/pull/1/head',
              'fuchsia_ctl_version': 'version:0.0.2',
              'build_host': True,
              'build_fuchsia': True,
              'build_android_aot': True,
              'build_android_debug': True,
              'android_sdk_license': 'android_sdk_hash',
              'android_sdk_preview_license': 'android_sdk_preview_hash',
              'gclient_variables': {'upload_fuchsia_sdk': True, 'fuchsia_sdk_hash': 'thehash'},
          }
      ),
  )
  yield api.test(
      'Linux Fuchsia skips on duplicate',
      api.platform('linux', 64),
      api.buildbucket.ci_build(
          builder='Linux Engine',
          git_repo=GIT_REPO,
          project='flutter',
          revision='%s' % git_revision,
      ),
      api.step_data(
          'cipd search flutter/fuchsia git_revision:%s' % git_revision,
          api.cipd.example_search('flutter/fuchsia', instances=0)
      ),
      collect_build_output,
      api.properties(
          **{
              'clobber': False,
              'goma_jobs': '1024',
              'fuchsia_ctl_version': 'version:0.0.2',
              'build_host': False,
              'build_fuchsia': True,
              'build_android_aot': False,
              'build_android_jit_release': False,
              'build_android_debug': False,
              'no_maven': True,
              'upload_packages': True,
              'android_sdk_license': 'android_sdk_hash',
              'android_sdk_preview_license': 'android_sdk_preview_hash',
              'force_upload': False
          }
      ),
      api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
      api.properties.environ(EnvProperties(SKIP_ANDROID='TRUE')),
  )
  yield api.test(
      'Linux Fuchsia failing test',
      api.platform('linux', 64),
      api.buildbucket.ci_build(
          builder='Linux Engine', git_repo=GIT_REPO, project='flutter'
      ),
      api.step_data(
          'gn --fuchsia --fuchsia-cpu x64 --runtime-mode debug --no-lto',
          retcode=1
      ),
      api.properties(
          **{
              'clobber': False,
              'goma_jobs': '1024',
              'fuchsia_ctl_version': 'version:0.0.2',
              'build_host': False,
              'build_fuchsia': True,
              'build_android_aot': False,
              'build_android_debug': False,
              'no_maven': False,
              'upload_packages': True,
              'android_sdk_license': 'android_sdk_hash',
              'android_sdk_preview_license': 'android_sdk_preview_hash',
              'force_upload': True
          }
      ),
      api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
  )
  yield api.test(
      'fail_android_aot_sharded_builds',
      # 64 bit linux machine
      api.platform('linux', 64),
      api.buildbucket.ci_build(
          builder='Linux Engine', git_repo=GIT_REPO, project='flutter'
      ),
      api.step_data(
          'Build and test arm64 profile.gn --runtime-mode profile --android --android-cpu arm64',
          retcode=1
      ),
      api.properties(
          **{
              'clobber': False,
              'goma_jobs': '1024',
              'fuchsia_ctl_version': 'version:0.0.2',
              'build_host': False,
              'build_fuchsia': False,
              'build_android_aot': True,
              'build_android_debug': False,
              'dependencies': [
                {
                    'dependency': 'open_jdk',
                    'version': 'version:11',
                }
              ],
              'no_maven': False,
              'upload_packages': True,
              'android_sdk_license': 'android_sdk_hash',
              'android_sdk_preview_license': 'android_sdk_preview_hash',
              'force_upload': True
          }
      ),
      api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
  )
