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

DEPS = [
  'archive',
  'chromium_checkout',
  'commit_position',
  'depot_tools/bot_update',
  'depot_tools/gclient',
  'depot_tools/gsutil',
  'depot_tools/tryserver',
  'goma',
  'ios',
  'recipe_engine/context',
  'recipe_engine/path',
  'recipe_engine/properties',
  'recipe_engine/python',
  'recipe_engine/runtime',
  'recipe_engine/step',
  'webrtc',
  'zip',
]


def RunSteps(api):
  api.gclient.set_config('webrtc_ios')

  api.webrtc.checkout()
  api.gclient.runhooks()

  goma_dir = api.goma.ensure_goma()
  api.goma.start()
  build_exit_status = 1

  api.ios.ensure_xcode("10a254a")

  try:
    build_script = api.path['checkout'].join('tools_webrtc', 'ios',
                                             'build_ios_libs.py')
    if not api.tryserver.is_tryserver:
      api.step('cleanup', [build_script, '-c'])

    step_result = api.python(
        'build',
        build_script,
        args=['-r', api.webrtc.revision_number,
              '--use-goma',
              '--extra-gn-args=goma_dir=\"%s\"' % goma_dir,
              '--verbose'],
    )
    build_exit_status = step_result.retcode
  except api.step.StepFailure as e:
    build_exit_status = e.retcode
    raise e
  finally:
    api.goma.stop(ninja_log_compiler='goma',
                  build_exit_status=build_exit_status)

  output_dir = api.path['checkout'].join('out_ios_libs')

  api.webrtc.get_binary_sizes(files=['WebRTC.framework/WebRTC'],
                              base_dir=output_dir)

  if not api.tryserver.is_tryserver:
    zip_out = api.path['start_dir'].join('webrtc_ios_api_framework.zip')
    pkg = api.zip.make_package(output_dir, zip_out)
    pkg.add_directory(output_dir.join('WebRTC.framework'))
    pkg.zip('zip archive')

    if not api.runtime.is_experimental:
      api.gsutil.upload(
          zip_out,
          'chromium-webrtc',
          ('ios_api_framework/webrtc_ios_api_framework_%s.zip' %
           api.webrtc.revision_number),
          args=['-a', 'public-read'],
          unauthenticated_url=True)


def GenTests(api):
  yield (
    api.test('build_ok') +
    api.properties.generic(mastername='client.webrtc',
                           buildername='iOS API Framework Builder',
                           path_config='kitchen')
  )

  yield (
    api.test('build_failure') +
    api.properties.generic(mastername='client.webrtc',
                           buildername='iOS API Framework Builder',
                           path_config='kitchen') +
    api.step_data('build', retcode=1)
  )

  yield (
    api.test('trybot_build') +
    api.properties.tryserver(mastername='tryserver.webrtc',
                             buildername='ios_api_framework',
                             gerrit_url='https://webrtc-review.googlesource.com',
                             gerrit_project='src',
                             path_config='kitchen')
  )
