#!/bin/bash

# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

. "$(dirname "$0")/lib/sign_android_lib.sh"

# Expected APK signatures depending on the type of APK and the type of build.
declare -A platform_sha=(
  ['cheets']='AA:04:E0:5F:82:9C:7E:D1:B9:F8:FC:99:6C:5A:54:43:83:D9:F5:BC'
  ['aosp']='27:19:6E:38:6B:87:5E:76:AD:F7:00:E7:EA:84:E4:C6:EE:E3:3D:FA'
)
declare -A media_sha=(
  ['cheets']='D4:C4:2D:E0:B9:1B:15:72:FA:7D:A7:21:E0:A6:09:94:B4:4C:B5:AE'
  ['aosp']='B7:9D:F4:A8:2E:90:B5:7E:A7:65:25:AB:70:37:AB:23:8A:42:F5:D3'
)
declare -A shared_sha=(
  ['cheets']='38:B6:2C:E1:75:98:E3:E1:1C:CC:F6:6B:83:BB:97:0E:2D:40:6C:AE'
  ['aosp']='5B:36:8C:FF:2D:A2:68:69:96:BC:95:EA:C1:90:EA:A4:F5:63:0F:E5'
)
declare -A release_sha=(
  ['cheets']='EC:63:36:20:23:B7:CB:66:18:70:D3:39:3C:A9:AE:7E:EF:A9:32:42'
  ['aosp']='61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81'
)


test_android_choose_key_invalid_keyset() {
  local keyname
  local keyset
  local keysets=("invalid_keyset" " " "")

  for keyset in "${keysets[@]}"; do
    echo "TEST: Detection of invalid keyset '${keyset}'."
    if keyname=$(android_choose_key "ignored_sha1" "${keyset}"); then
      : $(( NUM_TEST_FAILURES += 1 ))
      echo "ERROR: Failed to detect invalid keyset '${keyset}'."
    else
      echo "PASS: Detected invalid keyset '${keyset}'."
    fi
  done
}

android_choose_key_test_helper() {
  local sha1="$1"
  local keyset="$2"
  local expected_keyname="$3"
  local keyname="invalid_key"

  echo "TEST: Detect '${expected_keyname}' key name for '${keyset}' keyset."
  keyname=$(android_choose_key "${sha1}" "${keyset}")
  if [[ "${keyname}" != "${expected_keyname}" ]]; then
    : $(( NUM_TEST_FAILURES += 1 ))
    echo "ERROR: Incorrect key name '${keyname}' returned."
  else
    echo "PASS: Correct key name '${keyname}' returned."
  fi
}

test_android_choose_key() {
  local keyset
  local expected_keyname

  local keysets=("cheets" "aosp")
  for keyset in "${keysets[@]}"; do
    expected_keyname="platform"
    android_choose_key_test_helper "${platform_sha[${keyset}]}" "${keyset}" \
      "${expected_keyname}"
    expected_keyname="media"
    android_choose_key_test_helper "${media_sha[${keyset}]}" "${keyset}" \
      "${expected_keyname}"
    expected_keyname="shared"
    android_choose_key_test_helper "${shared_sha[${keyset}]}" "${keyset}" \
      "${expected_keyname}"
    expected_keyname="releasekey"
    android_choose_key_test_helper "${release_sha[${keyset}]}" "${keyset}" \
      "${expected_keyname}"
  done
}

build_flavor_test_helper() {
  local prop_file="${BUILD}/build.prop"
  local prop_content="$1"
  local expected_flavor_prop="$2"
  local flavor_prop=""

  echo "${prop_content}" > "${prop_file}"
  flavor_prop=$(android_get_build_flavor_prop "${prop_file}")
  if [[ "${flavor_prop}" != "${expected_flavor_prop}" ]]; then
    : $(( NUM_TEST_FAILURES += 1 ))
    echo "ERROR: Incorrect build flavor '${flavor_prop}' returned."
  else
    echo "PASS: Correct key name '${flavor_prop}' returned."
  fi
  rm "${prop_file}"
}

test_android_get_build_flavor_prop() {
  local prop_file="${BUILD}/build.prop"
  local prop_content=""
  local flavor_prop=""

  echo "TEST: Extract ro.build.flavor property."
  prop_content="ro.random.prop=foo
other.prop=bar
x=foobar
ro.build.flavor=cheets_x86-user
another.prop=barfoo"
  build_flavor_test_helper "${prop_content}" "cheets_x86-user"

  echo "TEST: Extract single ro.build.flavor property."
  prop_content="ro.build.flavor=cheets_x86-user"
  build_flavor_test_helper "${prop_content}" "cheets_x86-user"

  echo "TEST: Avoid commented out ro.build.flavor property."
  prop_content="ro.random.prop=foo
other.prop=bar
x=foobar
#ro.build.flavor=commented_out
ro.build.flavor=cheets_x86-user
another.prop=barfoo"
  build_flavor_test_helper "${prop_content}" "cheets_x86-user"

  # Missing ro.build.flavor property.
  echo "TEST: Detect missing ro.build.flavor property."
  echo "ro.random.prop=foo" > "${prop_file}"
  if flavor_prop=$(android_get_build_flavor_prop "${prop_file}"); then
    : $(( NUM_TEST_FAILURES += 1 ))
    echo "ERROR: Failed to detect missing ro.build.flavor property."
  else
    echo "PASS: Detected missing ro.build.flavor property."
  fi
  rm "${prop_file}"
}

choose_signing_keyset_test_helper() {
  local flavor_prop="$1"
  local expected_keyset="$2"
  local keyset=""

  keyset=$(android_choose_signing_keyset "${flavor_prop}")
  if [[ "${keyset}" != "${expected_keyset}" ]]; then
    : $(( NUM_TEST_FAILURES += 1 ))
    echo "ERROR: Incorrect keyset '${keyset}' returned instead of \
'${expected_keyset}'."
  else
    echo "PASS: Correct keyset '${keyset}' returned."
  fi
}

choose_signing_keyset_test_invalid_flavors() {
  local flavor="$1"

  echo "TEST: Detect invalid build flavor '${flavor}'."
  if android_choose_signing_keyset "${flavor}"; then
    : $(( NUM_TEST_FAILURES += 1 ))
    echo "ERROR: Failed to detect invalid build flavor '${flavor}'."
  else
    echo "PASS: Detected invalid build flavor '${flavor}'."
  fi
}

test_android_choose_signing_keyset() {
  echo "TEST: Keyset for aosp_cheets build."
  choose_signing_keyset_test_helper "aosp_cheets_x86-userdebug" "aosp"
  echo "TEST: Keyset for sdk_google_cheets build."
  choose_signing_keyset_test_helper "sdk_google_cheets_x86-userdebug" "cheets"
  echo "TEST: Keyset for sdk_cheets build."
  choose_signing_keyset_test_helper "sdk_cheets_x86-userdebug" "cheets"
  echo "TEST: Keyset for cheets_x86 build."
  choose_signing_keyset_test_helper "cheets_x86-user" "cheets"
  echo "TEST: Keyset for cheets_arm build."
  choose_signing_keyset_test_helper "cheets_arm-user" "cheets"
  echo "TEST: Keyset for cheets_x86_64 build."
  choose_signing_keyset_test_helper "cheets_x86_64-user" "cheets"
  echo "TEST: Keyset for userdebug build."
  choose_signing_keyset_test_helper "cheets_x86-userdebug" "cheets"

  choose_signing_keyset_test_invalid_flavors "aosp"
  choose_signing_keyset_test_invalid_flavors "cheets"
  choose_signing_keyset_test_invalid_flavors ""
  choose_signing_keyset_test_invalid_flavors " "
}

main() {
  if [[ $# -ne 0 ]]; then
    echo "FAIL: unexpected arguments '$@'."
    return 1
  fi

  BUILD=$(mktemp -d)
  echo "Setting temporary build directory as '${BUILD}'."

  test_android_choose_key_invalid_keyset
  test_android_choose_key
  test_android_get_build_flavor_prop
  test_android_choose_signing_keyset

  echo "Deleting temporary build directory '${BUILD}'."
  rmdir "${BUILD}"

  if [[ ${NUM_TEST_FAILURES} -gt 0 ]]; then
    echo "FAIL: found ${NUM_TEST_FAILURES} failed :(."
    return 1
  fi
  echo "PASS: all tests passed :)."
  return 0
}

# Global incremented by each test when they fail.
NUM_TEST_FAILURES=0
main "$@"
