#!/usr/bin/python
# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

"""
Dartium on Android buildbot steps.

Runs steps after the buildbot builds Dartium on Android,
which should upload the APK to an attached device, and run
Dart and chromium tests on it.
"""

import optparse
import os
import string
import subprocess
import sys

import bot
import bot_utils

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.join(SCRIPT_DIR, '..'))
import utils

CS_LOCATION = 'apks/ContentShell.apk'

def GetOptionsParser():
  parser = optparse.OptionParser("usage: %prog [options]")
  parser.add_option("--build-products-dir",
                    help="The directory containing the products of the build.")
  return parser


def UploadSetACL(gsutil, local, remote):
  gsutil.upload(local, remote, public=True)


def UploadAPKs(options):
  with bot.BuildStep('Upload apk'):
    bot_name = os.environ.get("BUILDBOT_BUILDERNAME")
    channel = bot_utils.GetChannelFromName(bot_name)
    namer = bot_utils.GCSNamer(channel=channel)
    gsutil = bot_utils.GSUtil()

    web_link_prefix = 'https://storage.cloud.google.com/'

    # Archive content shell
    local = os.path.join(options.build_products_dir, CS_LOCATION)

    for revision in [utils.GetSVNRevision(), 'latest']:
      # TODO(whesse): pass in arch and mode from reciepe
      remote = namer.dartium_android_apk_filepath(revision,
                                                  'content_shell-android',
                                                  'arm',
                                                  'release')
      content_shell_link = string.replace(remote, 'gs://', web_link_prefix)
      UploadSetACL(gsutil, local, remote)
      print "Uploaded content shell, available from: %s" % content_shell_link


def RunContentShellTests(options):
  with bot.BuildStep('ContentShell tests'):
    subprocess.check_call([os.path.join(SCRIPT_DIR, 'run_android_tests.sh'),
        os.path.join(options.build_products_dir, CS_LOCATION)])


def main():
  if sys.platform != 'linux2':
    print "This script was only tested on linux. Please run it on linux!"
    sys.exit(1)

  parser = GetOptionsParser()
  (options, args) = parser.parse_args()

  if not options.build_products_dir:
    print "No build products directory given."
    sys.exit(1)

  UploadAPKs(options)
  RunContentShellTests(options)
  sys.exit(0)

if __name__ == '__main__':
  main()
