summaryrefslogtreecommitdiff
path: root/scripts/image_signing/sign_android_unittests.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/image_signing/sign_android_unittests.sh')
-rwxr-xr-xscripts/image_signing/sign_android_unittests.sh210
1 files changed, 210 insertions, 0 deletions
diff --git a/scripts/image_signing/sign_android_unittests.sh b/scripts/image_signing/sign_android_unittests.sh
new file mode 100755
index 00000000..00a651ff
--- /dev/null
+++ b/scripts/image_signing/sign_android_unittests.sh
@@ -0,0 +1,210 @@
+#!/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 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 "$@"