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

SCRIPT_DIR=$(dirname $0)

# Status of whole test script.
exit_status=0
# Status of current test suite.
test_status=0

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

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

[[ -n "$ANDROID_PRODUCT_OUT" ]] \
  || die "You need to source and lunch before you can use this script."

[[ -n "$ANDROID_HOST_OUT" ]] \
  || die "You need to source and lunch before you can use this script."

if [ ! -e "$ANDROID_HOST_OUT/bin/debugfs" ] ; then
  say "Could not find debugfs, building now."
  make debugfs-host || die "Cannot build debugfs"
fi

# Fail early.
set -e

build_apex_p=true
list_image_files_p=false
print_image_tree_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 using `find`
  -t, --print-tree    list the contents of the ext4 image using `tree`
  -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;;
    (-t|--print-tree) print_image_tree_p=true;;
    (-h|--help) usage;;
    (*) die "Unknown option: '$1'
Try '$0 --help' for more information.";;
  esac
  shift
done

if $print_image_tree_p; then
  which tree >/dev/null || die "This script requires the 'tree' tool.
On Debian-based systems, this can be installed with:

   sudo apt-get install tree
"
fi


# build_apex APEX_MODULE
# ----------------------
# Build APEX package APEX_MODULE.
function build_apex {
  if $build_apex_p; then
    local apex_module=$1
    say "Building package $apex_module" && make "$apex_module" || die "Cannot build $apex_module"
  fi
}

# maybe_list_apex_contents MOUNT_POINT
# ------------------------------------
# If any listing/printing option was used, honor them and display the contents
# of the APEX payload at MOUNT_POINT.
function maybe_list_apex_contents {
  local mount_point=$1

  # List the contents of the mounted image using `find` (optional).
  if $list_image_files_p; then
    say "Listing image files" && find "$mount_point"
  fi

  # List the contents of the mounted image using `tree` (optional).
  if $print_image_tree_p; then
    say "Printing image tree" && ls -ld "$mount_point" && tree -aph --du "$mount_point"
  fi
}

# maybe_list_apex_contents_apex APEX TMPDIR [other]
function maybe_list_apex_contents_apex {
  local apex=$1
  local tmpdir=$2
  shift 2

  # List the contents of the apex in list form.
  if $list_image_files_p; then
    say "Listing image files"
    $SCRIPT_DIR/art_apex_test.py --list --tmpdir "$tmpdir" $@ $apex
  fi

  # List the contents of the apex in tree form.
  if $print_image_tree_p; then
    say "Printing image tree"
    $SCRIPT_DIR/art_apex_test.py --tree --tmpdir "$tmpdir" $@ $apex
  fi
}

function fail_check {
  echo "$0: FAILED: $*"
  test_status=1
  exit_status=1
}

function check_file {
  [[ -f "$mount_point/$1" ]] || fail_check "Cannot find file '$1' in mounted image"
}

function check_binary {
  [[ -x "$mount_point/bin/$1" ]] || fail_check "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?
  if ! [[ -L "$mount_point/bin/${1}" ]]; then
    fail_check "Cannot find symlink for multilib binary '$1' in mounted image"
  fi
  [[ -x "$mount_point/bin/${1}32" ]] || [[ -x "$mount_point/bin/${1}64" ]] \
    || fail_check "Cannot find binary '$1' in mounted image"
}

function check_binary_symlink {
  [[ -h "$mount_point/bin/$1" ]] || fail_check "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" ]] \
    || fail_check "Cannot find library '$1' in mounted image"
}

function check_no_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 "Found unwanted library '$1' in mounted image"
}

function check_java_library {
  [[ -f "$mount_point/javalib/$1" ]] || fail_check "Cannot find java library '$1' in mounted image"
}

# !!! NOTE: Please also update art_apex_test.py !!!

# Check contents of APEX payload located in `$mount_point`.
function check_release_contents {
  # Check that the mounted image contains an APEX manifest.
  check_file apex_manifest.json

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

  # oatdump is only in device apex's due to build rules
  # TODO: Check for it when it is also built for host.
  : check_binary oatdump

  # Check that the mounted image contains Android Runtime libraries.
  check_library libart-compiler.so
  check_library libart-dexlayout.so
  check_library libart.so
  check_library libartbase.so
  check_library libartpalette.so
  check_no_library libartpalette-system.so
  check_library libdexfile.so
  check_library libdexfile_external.so
  check_library libopenjdkjvm.so
  check_library libopenjdkjvmti.so
  check_library libprofile.so
  # Check that the mounted image contains Android Core libraries.
  check_library "libexpat${host_suffix}.so"
  check_library libjavacore.so
  check_library libopenjdk.so
  check_library "libz${host_suffix}.so"
  check_library libziparchive.so
  # Check that the mounted image contains additional required libraries.
  check_library libadbconnection.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
  #   ...
  #
  # ?

  check_java_library core-oj.jar
  check_java_library core-libart.jar
  check_java_library okhttp.jar
  check_java_library bouncycastle.jar
  check_java_library apache-xml.jar
}

# Check debug contents of APEX payload located in `$mount_point`.
function check_debug_contents {
  # Check that the mounted image contains ART tools binaries.
  check_binary dexdiag
  check_binary dexdump
  check_binary dexlist

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

  # Check that the mounted image contains Android Runtime debug libraries.
  check_library libartbased.so
  check_library libartd-compiler.so
  check_library libartd-dexlayout.so
  check_library libartd.so
  check_library libdexfiled.so
  check_library libopenjdkjvmd.so
  check_library libopenjdkjvmtid.so
  check_library libprofiled.so
  # Check that the mounted image contains Android Core debug libraries.
  check_library libopenjdkd.so
  # Check that the mounted image contains additional required debug libraries.
  check_library libadbconnectiond.so
}

# Testing target (device) APEX packages.
# ======================================

# Clean-up.
function cleanup_target {
  rm -rf "$work_dir"
}

# Garbage collection.
function finish_target {
  # Don't fail early during cleanup.
  set +e
  cleanup_target
}

# Testing release APEX package (com.android.runtime.release).
# -----------------------------------------------------------

apex_module="com.android.runtime.release"
test_status=0

say "Processing APEX package $apex_module"

work_dir=$(mktemp -d)

trap finish_target EXIT

# Build the APEX package (optional).
build_apex "$apex_module"
apex_path="$ANDROID_PRODUCT_OUT/system/apex/${apex_module}.apex"

# List the contents of the APEX image (optional).
maybe_list_apex_contents_apex $apex_path $work_dir --target --debugfs $ANDROID_HOST_OUT/bin/debugfs

# Run tests on APEX package.
say "Checking APEX package $apex_module"
$SCRIPT_DIR/art_apex_test.py \
  --tmpdir $work_dir \
  --debugfs $ANDROID_HOST_OUT/bin/debugfs \
  --target \
  $apex_path \
    || fail_check "Release checks failed"

# Clean up.
trap - EXIT
cleanup_target

[[ "$test_status" = 0 ]] && say "$apex_module tests passed"
echo

# Testing debug APEX package (com.android.runtime.debug).
# -------------------------------------------------------

apex_module="com.android.runtime.debug"
test_status=0

say "Processing APEX package $apex_module"

work_dir=$(mktemp -d)

trap finish_target EXIT

# Build the APEX package (optional).
build_apex "$apex_module"
apex_path="$ANDROID_PRODUCT_OUT/system/apex/${apex_module}.apex"

# List the contents of the APEX image (optional).
maybe_list_apex_contents_apex $apex_path $work_dir --target --debugfs $ANDROID_HOST_OUT/bin/debugfs

# Run tests on APEX package.
say "Checking APEX package $apex_module"
$SCRIPT_DIR/art_apex_test.py \
  --tmpdir $work_dir \
  --debugfs $ANDROID_HOST_OUT/bin/debugfs \
  --target \
  --debug \
  $apex_path \
    || fail_check "Debug checks failed"

# Clean up.
trap - EXIT
cleanup_target

[[ "$test_status" = 0 ]] && say "$apex_module tests passed"
echo


# Testing host APEX package (com.android.runtime.host).
# =====================================================

# Clean-up.
function cleanup_host {
  rm -rf "$work_dir"
}

# Garbage collection.
function finish_host {
  # Don't fail early during cleanup.
  set +e
  cleanup_host
}

# setup_host_apex APEX_MODULE MOUNT_POINT
# ---------------------------------------
# Extract Zip file from host APEX_MODULE and extract it in MOUNT_POINT.
function setup_host_apex {
  local apex_module=$1
  local mount_point=$2
  local system_apexdir="$ANDROID_HOST_OUT/apex"
  local apex_package="$system_apexdir/$apex_module.zipapex"

  say "Extracting payload"

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

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

apex_module="com.android.runtime.host"
test_status=0

say "Processing APEX package $apex_module"

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

trap finish_host EXIT

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

# Set up APEX package.
setup_host_apex "$apex_module" "$mount_point"

# List the contents of the APEX image (optional).
maybe_list_apex_contents "$mount_point"

# Run tests on APEX package.
say "Checking APEX package $apex_module"
check_release_contents "$apex_module"
check_debug_contents

# Clean up.
trap - EXIT
cleanup_host

[[ "$test_status" = 0 ]] && say "$apex_module tests passed"

[[ "$exit_status" = 0 ]] && say "All Android Runtime APEX tests passed"

exit $exit_status
