#!/bin/bash

# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Run Android Runtime APEX tests.

function say {
  echo "$0: $*"
}

function die {
  echo "$0: $*"
  exit 1
}

which guestmount >/dev/null && which guestunmount >/dev/null && which virt-filesystems >/dev/null \
  || die "This script requires 'guestmount', 'guestunmount',
and 'virt-filesystems' from libguestfs. On Debian-based systems, these tools
can be installed with:

   sudo apt-get install libguestfs-tools
"
[[ -n "$ANDROID_PRODUCT_OUT" ]] \
  || die "You need to source and lunch before you can use this script."

# Fail early.
set -e

build_apex_p=true
list_image_files_p=false

function usage {
  cat <<EOF
Usage: $0 [OPTION]
Build (optional) and run tests on Android Runtime APEX package (on host).

  -s, --skip-build    skip the build step
  -l, --list-files    list the contents of the ext4 image
  -h, --help          display this help and exit

EOF
  exit
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    (-s|--skip-build) build_apex_p=false;;
    (-l|--list-files) list_image_files_p=true;;
    (-h|--help) usage;;
    (*) die "Unknown option: '$1'
Try '$0 --help' for more information.";;
  esac
  shift
done

work_dir=$(mktemp -d)
mount_point="$work_dir/image"

function check_binary {
  [[ -x "$mount_point/bin/$1" ]] || die "Cannot find binary '$1' in mounted image"
}

function check_multilib_binary {
  # TODO: Use $TARGET_ARCH (e.g. check whether it is "arm" or "arm64") to improve
  # the precision of this test?
  [[ -x "$mount_point/bin/${1}32" ]] || [[ -x "$mount_point/bin/${1}64" ]] \
    || die "Cannot find binary '$1' in mounted image"
}

function check_binary_symlink {
  [[ -h "$mount_point/bin/$1" ]] || die "Cannot find symbolic link '$1' in mounted image"
}

function check_library {
  # TODO: Use $TARGET_ARCH (e.g. check whether it is "arm" or "arm64") to improve
  # the precision of this test?
  [[ -f "$mount_point/lib/$1" ]] || [[ -f "$mount_point/lib64/$1" ]] \
    || die "Cannot find library '$1' in mounted image"
}

function build_apex {
  if $build_apex_p; then
    say "Building package $1" && make "$1" || die "Cannot build $1"
  fi
}

function check_contents {

  # Check that the mounted image contains a manifest.
  [[ -f "$mount_point/apex_manifest.json" ]] || die "no manifest"

  # Check that the mounted image contains ART base binaries.
  check_multilib_binary dalvikvm
  # TODO: Does not work yet.
  : check_binary_symlink dalvikvm
  check_binary dex2oat
  check_binary dexoptanalyzer
  check_binary profman

  # Check that the mounted image contains ART tools binaries.
  check_binary dexdiag
  check_binary dexdump
  check_binary dexlist
  # oatdump is only in device apex's due to build rules
  # check_binary oatdump

  # Check that the mounted image contains ART debug binaries.
  check_binary dex2oatd
  check_binary dexoptanalyzerd
  check_binary profmand

  # Check that the mounted image contains ART libraries.
  check_library libart-compiler.so
  check_library libart.so
  check_library libopenjdkjvm.so
  check_library libopenjdkjvmti.so
  check_library libadbconnection.so
  # TODO: Should we check for these libraries too, even if they are not explicitly
  # listed as dependencies in the Android Runtime APEX module rule?
  check_library libartbase.so
  check_library libart-dexlayout.so
  check_library libdexfile.so
  check_library libprofile.so

  # Check that the mounted image contains ART debug libraries.
  check_library libartd-compiler.so
  check_library libartd.so
  check_library libopenjdkd.so
  check_library libopenjdkjvmd.so
  check_library libopenjdkjvmtid.so
  check_library libadbconnectiond.so
  # TODO: Should we check for these libraries too, even if they are not explicitly
  # listed as dependencies in the Android Runtime APEX module rule?
  check_library libdexfiled.so
  check_library libartbased.so
  check_library libartd-dexlayout.so
  check_library libprofiled.so

  # TODO: Should we check for other libraries, such as:
  #
  #   libbacktrace.so
  #   libbase.so
  #   liblog.so
  #   libsigchain.so
  #   libtombstoned_client.so
  #   libunwindstack.so
  #   libvixl.so
  #   libvixld.so
  #   ...
  #
  # ?
}


# *****************************************
# * Testing for com.android.runtime.debug *
# *****************************************

# Garbage collection.
function finish_device_debug {
  # Don't fail early during cleanup.
  set +e
  guestunmount "$mount_point"
  rm -rf "$work_dir"
}

trap finish_device_debug EXIT

# TODO: Also exercise the Release Runtime APEX (`com.android.runtime.release`).
apex_module="com.android.runtime.debug"

# Build the Android Runtime APEX package (optional).
build_apex $apex_module

system_apexdir="$ANDROID_PRODUCT_OUT/system/apex"
apex_package="$system_apexdir/$apex_module.apex"

say "Extracting and mounting image"

# Extract the payload from the Android Runtime APEX.
image_filename="apex_payload.img"
unzip -q "$apex_package" "$image_filename" -d "$work_dir"
mkdir "$mount_point"
image_file="$work_dir/$image_filename"

# Check filesystems in the image.
image_filesystems="$work_dir/image_filesystems"
virt-filesystems -a "$image_file" >"$image_filesystems"
# We expect a single partition (/dev/sda) in the image.
partition="/dev/sda"
echo "$partition" | cmp "$image_filesystems" -

# Mount the image from the Android Runtime APEX.
guestmount -a "$image_file" -m "$partition" "$mount_point"

# List the contents of the mounted image (optional).
$list_image_files_p && say "Listing image files" && ls -ld "$mount_point" && tree -ap "$mount_point"

say "Running tests"

check_contents

# Check for files pulled in from device-only oatdump.
check_binary oatdump
check_library libart-disassembler.so

# Cleanup
trap - EXIT
guestunmount "$mount_point"
rm -rf "$work_dir"

say "$apex_module Tests passed"

# ****************************************
# * Testing for com.android.runtime.host *
# ****************************************

# Garbage collection.
function finish_host {
  # Don't fail early during cleanup.
  set +e
  rm -rf "$work_dir"
}

work_dir=$(mktemp -d)
mount_point="$work_dir/zip"

trap finish_host EXIT

apex_module="com.android.runtime.host"

# Build the Android Runtime APEX package (optional).
build_apex $apex_module

system_apexdir="$ANDROID_HOST_OUT/apex"
apex_package="$system_apexdir/$apex_module.zipapex"

say "Extracting payload"

# Extract the payload from the Android Runtime APEX.
image_filename="apex_payload.zip"
unzip -q "$apex_package" "$image_filename" -d "$work_dir"
mkdir "$mount_point"
image_file="$work_dir/$image_filename"

# Unzipping the payload
unzip -q "$image_file" -d "$mount_point"

say "Running tests"

check_contents

say "$apex_module Tests passed"

say "Tests passed"
