| #!/bin/bash |
| # Copyright 2018 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # Unit tests for //scripts/pave-prebuilt. |
| # |
| # Usage: pave-prebuilt-tests |
| |
| set -o errexit |
| set -o nounset |
| set -o pipefail |
| |
| # Read in the tool under test. Set TESTING=1 to avoid invoking main(). |
| readonly PARENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" |
| TESTING=1 source "${PARENT_DIR}/../pave-prebuilt" |
| |
| # expect_archive_produces_id <archive-path> <expected-id> |
| function expect_archive_produces_id { |
| local archive="$1" |
| local expected_id="$2" |
| |
| # archive_to_unique_id expects the file to live in the filesystem, |
| # so create an empty file at a related path under a temp directory. |
| local tmpdir |
| tmpdir="$(mktemp -d)" |
| local full_archive="${tmpdir}/${archive}" |
| mkdir -p "$(dirname "${full_archive}")" |
| touch "${full_archive}" |
| |
| EXPECT_EQ \ |
| "${expected_id}" \ |
| "$(archive_to_unique_id "${full_archive}")" \ |
| "input filename '${full_archive}'" |
| |
| rm -rf "${tmpdir}" |
| } |
| |
| function test::archive_to_unique_id { |
| # Expected ID when falling back to the "hash the archive contents" case. |
| # Hash is the SHA-1 sum of an empty file. |
| local fallback_hash='hash-da39a3ee5e6b4b0d3255bfef95601890afd80709' |
| |
| # Stem tests # |
| |
| # A long hex hash followed by an extension is a stem. |
| expect_archive_produces_id \ |
| '/home/USER/Downloads/625284e057cc25a77cdab944d46ab3de692bade1.tar' \ |
| 'stem-625284e057cc25a77cdab944d46ab3de692bade1' |
| |
| # Extension doesn't matter. |
| expect_archive_produces_id \ |
| '/home/USER/Downloads/625284e057cc25a77cdab944d46ab3de692bade1.png' \ |
| 'stem-625284e057cc25a77cdab944d46ab3de692bade1' |
| |
| # A short hex hash is not a stem, and falls back to hashing. |
| expect_archive_produces_id \ |
| '/home/USER/Downloads/625284e0.tar' \ |
| "${fallback_hash}" |
| |
| # A long hex hash followed by non-hex before the extension is not a stem, |
| # and falls back to hashing. |
| expect_archive_produces_id \ |
| '/home/USER/Downloads/625284e057cc25a77cdab944d46ab3de692bade1__ZZZZZ.tar' \ |
| "${fallback_hash}" |
| |
| # Build ID tests # |
| |
| # A "fuchsia.*" file living in a numbered directory is a build ID. |
| expect_archive_produces_id \ |
| '/home/USER/.cache/builds/8937296116261653552/fuchsia.tar.gz' \ |
| 'build-8937296116261653552' |
| |
| # Extension dosen't matter. |
| expect_archive_produces_id \ |
| '/home/USER/.cache/builds/8937296116261653552/fuchsia.png' \ |
| 'build-8937296116261653552' |
| |
| # A "fuchsia.*" file living in a small-numbered directory is not a build ID, |
| # and falls back to hashing. |
| expect_archive_produces_id \ |
| '/home/USER/.cache/builds/552/fuchsia.tar.gz' \ |
| "${fallback_hash}" |
| |
| # A "fuchsia.*" file living in a number-prefixed directory is not a build ID, |
| # and falls back to hashing. |
| expect_archive_produces_id \ |
| '/home/USER/.cache/builds/8937296116261653552__ZZZZZ/fuchsia.tar.gz' \ |
| "${fallback_hash}" |
| |
| # A "fuchsia.*" file living in a non-numbered directory is not a build ID, |
| # and falls back to hashing. |
| expect_archive_produces_id \ |
| '/home/USER/Downloads/fuchsia.tar.gz' \ |
| "${fallback_hash}" |
| } |
| |
| # Build ID is sniffed even when archive is passed as a relative path. |
| function test::archive_to_unique_id_relative { |
| local tmpdir |
| tmpdir="$(mktemp -d)" |
| local archive='/home/USER/.cache/builds/8937296116261653552/fuchsia.tar.gz' |
| local full_archive="${tmpdir}/${archive}" |
| mkdir -p "$(dirname "${full_archive}")" |
| touch "${full_archive}" |
| |
| local unique_id |
| unique_id="$( |
| cd "$(dirname "${full_archive}")" |
| archive_to_unique_id ./fuchsia.tar.gz |
| )" |
| |
| EXPECT_EQ \ |
| 'build-8937296116261653552' \ |
| "${unique_id}" \ |
| "input filename './fuchsia.tar.gz'" |
| |
| rm -rf "${tmpdir}" |
| } |
| |
| # |
| # Test framework. |
| # TOOD(dbort): Move this to a common file if other tools want to use it. |
| # |
| |
| # Any failing assert/expect should set this to 1. |
| FAILED=0 |
| |
| function EXPECT_EQ { |
| local v1="$1" |
| shift |
| local v2="$1" |
| shift |
| if [[ "${v1}" != "${v2}" ]]; then |
| local msg="$@" |
| if [[ -n "${msg}" ]]; then |
| msg=": ${msg}" |
| fi |
| echo "TEST FAILURE: '${v1}' != '${v2}'${msg}" |
| FAILED=1 |
| return 1 |
| fi |
| } |
| |
| # Prints the names of all functions with a test:: prefix. |
| function print_test_functions { |
| # "declare -F" prints all declared function names, with lines like |
| # "declare -f funcname". |
| declare -F \ |
| | grep -E '^declare -f test::' \ |
| | sed -e 's/^declare -f //' |
| } |
| |
| function test_main { |
| local num_tests=0 |
| local num_failures=0 |
| for t in $(print_test_functions); do |
| num_tests=$(( num_tests + 1 )) |
| FAILED=0 |
| echo "RUNNING: ${t}" |
| "${t}" || FAILED=1 |
| if (( FAILED )); then |
| num_failures=$(( num_failures + 1 )) |
| echo "FAILED: ${t}" |
| else |
| echo "PASSED: ${t}" |
| fi |
| done |
| if (( num_failures == 0 )); then |
| echo "All ${num_tests} tests passed!" |
| echo "PASS" |
| return 0 |
| else |
| echo "${num_failures}/${num_tests} tests failed" |
| echo "FAIL" |
| return 1 |
| fi |
| } |
| |
| test_main "$@" |