#!/bin/bash
# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Script to ensure the avd is set up for testing.
#
# Usage: ./avd_setup.sh <path-to-adb-executable>

set -x
set -e

# Monitor but it appears the device is always ready within a couple seconds.
readonly WAIT_ITERS=60

# Validate a single config is returning the desired value.
function validate_config() {
    local adb=${1}
    local config=${2}
    local exp_return_value=${3}

    local ready=1
    # Wait for avd to reach home screen
    echo "Checking ${config} is returning ${exp_return_value}."

    for((i=0; i<${WAIT_ITERS}; i++)); do
        out=$(${adb} -s emulator-5554 shell "getprop ${config}" | tr -d '[:space:]')
        if [[ "${out}" = "${exp_return_value}" ]]; then
            echo "${config} is ready."
            ready=0
            break
        else
            echo "Config ${config} is not ready."
            echo "output: ${out}"
            sleep 1
        fi
    done

    if [[ ${ready} -eq 1 ]]; then
        echo "${config} was not ready in time."
        return 1
    fi

    return 0
}

# Validate an array of configs is returning their desired values.
function validate_all_configs() {
    local adb=$1; shift
    local config_array=("$@")
    for config in "${config_array[@]}"; do
        validate_config "${adb}" "${config}" "1"
        if [[ $? -ne 0 ]]; then
            echo "Config ${config} not ready."
            exit 1
        fi
    done
}

function print_device_list() {
    local adb=${1}
    local devices_output=$(${adb} devices)
    echo ""
    echo "${devices_output}"
    echo ""
}

function wait-for-device() {
    local remaining_attempts=6
    until adb shell true
    do
      ((remaining_attempts--))
      if [[ remaining_attempts -le 0 ]]
      then
        echo "Emulator not found"
        exit 1
      fi
      echo "Waiting for emulator to be available. Remaining attempts: $remaining_attempts"
      sleep 10
    done
    echo "Emulator is now available"
}

# path to the adb executable
adb=${1}

which ${adb}
if [[ $? -eq 1 ]]; then
    echo "Unable to locate adb on path."
fi

# properties to validate
declare -a configs_to_validate=("sys.boot_completed" "dev.bootcomplete")
print_device_list "${adb}"
echo "Killing adb server"
${adb} kill-server
sleep 5
# when you run any adb command and the server is not up it will start it.
echo "Starting adb server"
${adb} start-server
print_device_list "${adb}"
echo "Waiting for device"
wait-for-device

echo "Validating that emulator is booted."
validate_all_configs "${adb}" "${configs_to_validate[@]}"

# Set the density DPI
${adb} shell wm density 400
# unlock avd
${adb} shell input keyevent 82
# Ensure developer mode is enabled
${adb} shell settings put global development_settings_enabled 1

# Enable MTP file transfer
# depending on the version under test this is setFunctions or setFunction (no s)
${adb} shell svc usb setFunction mtp

print_device_list "${adb}"

echo "Validating that emulator is booted."
validate_all_configs "${adb}" "${configs_to_validate[@]}"

${adb} shell input keyevent 82

print_device_list "${adb}"

# clear exit signal for the LUCI ci.
echo "Emulator ready."
exit 0
