#!/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

runnerVersion="1.4.0"
rulesVersion=runnerVersion
espressoVersion="3.4.0"
coreVersion=runnerVersion
extJUnitVersion="1.1.3"
extTruthVersion=runnerVersion
servicesVersion=runnerVersion
jankTestHelperVersion="1.0.1"
uiAutomatorVersion="2.2.0"

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.uiautomator:uiautomator":"androidx.test.uiautomator",
    "androidx.test.services:storage":"androidx.test.services.storage",
    }

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

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

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-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", runnerVersion)
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.uiautomator", "uiautomator", uiAutomatorVersion)
downloadArtifact("androidx.test.services", "storage", servicesVersion)

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

cmd("pom2bp " + atxRewriteStr +
    # map external maven dependencies to Android module names
    "-rewrite com.google.truth:truth=truth-prebuilt " +
    "-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 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 " +
    "-sdk-version current " +
    "-static-deps " +
    ". > Android.bp")
