#!/usr/bin/python3

# Helper script for updating androidx.test prebuilts from maven
#
# Usage:
#   a. Initialize android environment eg . build/envsetup.sh; lunch <target>
#   b. Update the version numbers in this file
#   c. ./prebuilts/misc/androidx-test/update-from-gmaven.py
#
# The script will then:
#   1. Remove the previous artifacts
#   2. Download the aars and poms into a file structure mirroring their maven
#      path
#   3. Extract the AndroidManifest from the aars into the manifests folder
#   4. Run pom2bp to generate the Android.bp

import os
import subprocess
import sys

monitorVersion="1.7.0"
runnerVersion="1.6.0"
rulesVersion="1.6.0"
espressoVersion="3.6.0"
coreVersion="1.6.0"
extJUnitVersion="1.2.0"
extTruthVersion="1.6.0"
orchestratorVersion="1.5.0"
servicesVersion="1.5.0"
jankTestHelperVersion="1.0.1"

mavenToBpPatternMap = {
    "androidx.test:" : "androidx.test.",
    "androidx.test.ext:": "androidx.test.ext.",
    "androidx.test.espresso:espresso-":"androidx.test.espresso.",
    "androidx.test.janktesthelper:janktesthelper":"androidx.test.janktesthelper",
    "androidx.test.services:storage":"androidx.test.services.storage",
    "androidx.test.services:test-services":"androidx.test.services.test-services",
    "androidx.tracing:tracing":"androidx.tracing_tracing",
    "androidx.concurrent:concurrent-futures":"androidx.concurrent_concurrent-futures",
    "com.google.guava:listenablefuture":"guava-listenablefuture-prebuilt-jar",
    }

extraLibs = {
    "androidx.test.rules" : "android.test.base",
    }

prependLicenseTemplate = """
package {{
    default_applicable_licenses: ["Android-Apache-2.0"],
}}

filegroup {{
    name: "test-services.apk",
    srcs:
    ["androidx/test/services/test-services/{servicesVersion}/test-services-{servicesVersion}.apk",],
    path: "androidx/test/services/test-services/{servicesVersion}",
    visibility: [
        "//tools/tradefederation/core:__pkg__",
    ],
}}
"""

def cmd(args):
   print(args)
   out = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
   if (out.returncode != 0):
      print(out.stderr.decode("utf-8"))
      sys.exit(out.returncode)
   out_string = out.stdout.decode("utf-8")
   print(out_string)
   return out_string

def chdir(path):
   print("cd %s" % path)
   os.chdir(path)

def getAndroidRoot():
   if os.path.isdir(".repo/projects"):
      return os.getcwd()
   elif 'TOP' in os.environ:
      return os.environ['TOP']
   else:
      print("Error: Run from android source root or set TOP envvar")
      sys.exit(-1)

def downloadArtifact(groupId, artifactId, version):
   """Downloads an aar, sources.jar and pom from google maven"""
   groupPath = groupId.replace('.', '/')
   artifactDirPath = os.path.join(groupPath, artifactId, version)
   artifactPath = os.path.join(artifactDirPath, "%s-%s" % (artifactId, version))
   cmd("mkdir -p " + artifactDirPath)
   # download aar
   cmd("wget -O %s.aar https://dl.google.com/dl/android/maven2/%s.aar" % (artifactPath, artifactPath))

   # extract AndroidManifest.xml from aar, into path expected by pom2bp
   manifestDir = getManifestPath("%s:%s" % (groupId,artifactId))
   cmd("mkdir -p " + manifestDir)
   cmd("unzip -o %s.aar AndroidManifest.xml -d %s" % (artifactPath, manifestDir))

   # download pom
   cmd("wget -O %s.pom https://dl.google.com/dl/android/maven2/%s.pom" % (artifactPath, artifactPath))

   # download sources.jar
   cmd("wget -O %s-sources.jar https://dl.google.com/dl/android/maven2/%s-sources.jar" % (artifactPath, artifactPath))

def downloadApk(groupId, artifactId, version):
   """Downloads an apk from google maven"""
   groupPath = groupId.replace('.', '/')
   artifactDirPath = os.path.join(groupPath, artifactId, version)
   artifactPath = os.path.join(artifactDirPath, "%s-%s" % (artifactId, version))
   cmd("mkdir -p " + artifactDirPath)
   # download apk
   cmd("wget -O %s.apk https://dl.google.com/dl/android/maven2/%s.apk" % (artifactPath, artifactPath))
   # download pom
   cmd("wget -O %s.pom https://dl.google.com/dl/android/maven2/%s.pom" % (artifactPath, artifactPath))

def getManifestPath(mavenArtifactName):
  """Get the path to the aar's manifest as generated by pom2bp."""
  manifestPath = mavenArtifactName
  for searchPattern in mavenToBpPatternMap:
    manifestPath = manifestPath.replace(searchPattern, mavenToBpPatternMap[searchPattern])
  return "manifests/%s" % manifestPath

def updatePrependLicense():
  with open("prepend-license.txt", "w") as f:
    f.write(prependLicenseTemplate.format(servicesVersion = servicesVersion))


prebuiltDir = os.path.join(getAndroidRoot(), "prebuilts/misc/common/androidx-test")
chdir(prebuiltDir)

cmd("rm -rf androidx/test")
cmd("rm -rf manifests")

downloadArtifact("androidx.test", "core", coreVersion)
downloadArtifact("androidx.test.espresso", "espresso-accessibility", espressoVersion)
downloadArtifact("androidx.test.espresso", "espresso-core", espressoVersion)
downloadArtifact("androidx.test.espresso", "espresso-contrib", espressoVersion)
downloadArtifact("androidx.test.espresso", "espresso-idling-resource", espressoVersion)
downloadArtifact("androidx.test.espresso", "espresso-intents", espressoVersion)
downloadArtifact("androidx.test.espresso", "espresso-idling-resource", espressoVersion)
downloadArtifact("androidx.test.espresso", "espresso-web", espressoVersion)
downloadArtifact("androidx.test", "monitor", monitorVersion)
downloadArtifact("androidx.test", "rules", rulesVersion)
downloadArtifact("androidx.test", "runner", runnerVersion)
downloadArtifact("androidx.test.ext", "junit", extJUnitVersion)
downloadArtifact("androidx.test.ext", "truth", extTruthVersion)
downloadArtifact("androidx.test.janktesthelper", "janktesthelper", jankTestHelperVersion)
downloadArtifact("androidx.test.services", "storage", servicesVersion)
downloadApk("androidx.test.services", "test-services", servicesVersion)
downloadApk("androidx.test", "orchestrator", orchestratorVersion)


atxRewriteStr = ""
for name in mavenToBpPatternMap:
  atxRewriteStr += "-rewrite %s=%s " % (name, mavenToBpPatternMap[name])
for name in extraLibs:
  atxRewriteStr += "-extra-libs %s=%s " % (name, extraLibs[name])

updatePrependLicense()

cmd("pom2bp " + atxRewriteStr +
    # map external maven dependencies to Android module names
    "-rewrite com.google.truth:truth=truth " +
    "-rewrite net.sf.kxml:kxml2=kxml2-android " +
    "-rewrite androidx.lifecycle:lifecycle-common=androidx.lifecycle_lifecycle-common " +
    "-rewrite androidx.annotation:annotation=androidx.annotation_annotation " +
    "-rewrite org.hamcrest:hamcrest-integration=hamcrest " +
    "-rewrite org.hamcrest:hamcrest-core=hamcrest " +
    "-rewrite javax.inject:javax.inject=jsr330 " +
    "-rewrite com.google.android.material:material=com.google.android.material_material " +
    "-rewrite androidx.drawerlayout:drawerlayout=androidx.drawerlayout_drawerlayout " +
    "-rewrite androidx.viewpager:viewpager=androidx.viewpager_viewpager " +
    "-rewrite androidx.recyclerview:recyclerview=androidx.recyclerview_recyclerview " +
    "-rewrite androidx.core:core=androidx.core_core " +
    "-rewrite androidx.legacy:legacy-support-core-utils=androidx.legacy_legacy-support-core-utils " +
    "-rewrite androidx.appcompat:appcompat=androidx.appcompat_appcompat " +
    "-sdk-version current " +
    "-static-deps " +
    "-prepend prepend-license.txt " +
    ". > Android.bp")

