| #!/bin/bash |
| # Copyright 2020 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. |
| # |
| # Tests for fuchsia-common.sh library script |
| |
| # shellcheck disable=SC2034 |
| BT_FILE_DEPS=( |
| "scripts/sdk/gn/base/bin/fuchsia-common.sh" |
| "scripts/sdk/gn/bash_tests/gn-bash-test-lib.sh" |
| "scripts/sdk/gn/testdata/meta/manifest.json" |
| ) |
| |
| MOCKED_SSH_BIN="mocked/ssh" |
| MOCKED_SSH_KEYGEN_BIN="mocked/ssh-keygen" |
| MOCKED_HOSTNAME_BIN="mocked/hostname" |
| MOCKED_GSUTIL="mocked/gsutil" |
| MOCKED_CIPD="mocked/cipd" |
| MOCKED_PGREP="mocked/pgrep" |
| MOCKED_KILL="mocked/kill" |
| MOCKED_UNAME="mocked/uname" |
| # shellcheck disable=SC2034 |
| BT_MOCKED_TOOLS=( |
| "${MOCKED_SSH_BIN}" |
| "${MOCKED_SSH_KEYGEN_BIN}" |
| "${MOCKED_HOSTNAME_BIN}" |
| "scripts/sdk/gn/base/tools/x64/fconfig" |
| "scripts/sdk/gn/base/tools/arm64/fconfig" |
| "scripts/sdk/gn/base/tools/x64/device-finder" |
| "scripts/sdk/gn/base/tools/arm64/device-finder" |
| "${MOCKED_GSUTIL}" |
| "${MOCKED_CIPD}" |
| "${MOCKED_PGREP}" |
| "${MOCKED_KILL}" |
| "${MOCKED_UNAME}" |
| ) |
| |
| UNAME_BIN="$(command -v uname)" |
| |
| |
| BT_SET_UP() { |
| # shellcheck disable=SC1090 |
| source "${BT_TEMP_DIR}/scripts/sdk/gn/bash_tests/gn-bash-test-lib.sh" |
| |
| # Set the path to the mocked device finder before adding the mocks to the path. |
| MOCKED_DEVICE_FINDER="${BT_TEMP_DIR}/scripts/sdk/gn/base/$(gn-test-tools-subdir)/device-finder" |
| |
| |
| cat > "${BT_TEMP_DIR}/${MOCKED_SSH_BIN}.mock_side_effects" <<"EOF" |
| echo "$@" |
| EOF |
| |
| # set up the uname mock to call the real uname by default. |
| # tests will override the side effects for it as needed. |
| cat > "${BT_TEMP_DIR}/${MOCKED_UNAME}.mock_side_effects" << EOF |
| "${UNAME_BIN}" "\$@" |
| EOF |
| |
| # Add mocked system tools to the path. |
| export PATH="${BT_TEMP_DIR}/mocked:${PATH}" |
| |
| if [ "$(type -t kill)" = "builtin" ]; then |
| kill() { |
| "${BT_TEMP_DIR}/${MOCKED_KILL}" "$@" |
| } |
| fi |
| |
| # Copy the SDK manifest to the expected location |
| mkdir -p "${BT_TEMP_DIR}/scripts/sdk/gn/base/meta" |
| cp "${BT_TEMP_DIR}/scripts/sdk/gn/testdata/meta/manifest.json" "${BT_TEMP_DIR}/scripts/sdk/gn/base/meta/manifest.json" |
| |
| # Make "home" directory in the test dir so the paths are stable." |
| mkdir -p "${BT_TEMP_DIR}/test-home" |
| export HOME="${BT_TEMP_DIR}/test-home" |
| FUCHSIA_WORK_DIR="${HOME}/.fuchsia" |
| |
| # Source the library file. |
| # shellcheck disable=SC1090 |
| source "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fuchsia-common.sh" |
| } |
| |
| TEST_data-dir-by-env() { |
| # Tests that the data directory can be overridden by using the FUCHSIA_SDK_DATA_DIR varable. |
| export FUCHSIA_SDK_DATA_DIR="${BT_TEMP_DIR}/data-dir-by-env" |
| mkdir -p "${FUCHSIA_SDK_DATA_DIR}" |
| |
| BT_ASSERT_FUNCTION_EXISTS get-fuchsia-sshconfig-file |
| FILE_LOCATION="$(get-fuchsia-sshconfig-file)" |
| BT_EXPECT_EQ "${FILE_LOCATION}" "${FUCHSIA_SDK_DATA_DIR}/sshconfig" |
| } |
| |
| TEST_fx-warn() { |
| BT_ASSERT_FUNCTION_EXISTS fx-warn |
| fx-warn "This is a test" 2>fx-warn-stderr.txt > fx-warn-stdout.txt |
| BT_EXPECT_FILE_CONTAINS "fx-warn-stderr.txt" "WARNING: This is a test" |
| |
| [ ! -s fx-warn-stdout.txt ] || BT_EXPECT_GOOD_STATUS $? |
| } |
| |
| TEST_fx-error() { |
| BT_ASSERT_FUNCTION_EXISTS fx-error |
| fx-error "This is a test" 2>fx-error-stderr.txt > fx-error-stdout.txt |
| BT_EXPECT_FILE_CONTAINS "fx-error-stderr.txt" "ERROR: This is a test" |
| |
| [ ! -s fx-error-stdout.txt ] || BT_EXPECT_GOOD_STATUS $? |
| } |
| |
| TEST_ssh-keygen_missing_vars() { |
| export HOME="${BT_TEMP_DIR}/test-ssh-keygen-home" |
| mkdir -p "${HOME}" |
| BT_ASSERT_FUNCTION_EXISTS check-fuchsia-ssh-config |
| |
| # Simulate USER not being set |
| user="${USER}" |
| unset USER |
| |
| cat > "${BT_TEMP_DIR}/${MOCKED_SSH_KEYGEN_BIN}.mock_side_effects" <<"EOF" |
| echo "$@" |
| EOF |
| |
| # Simulate hostname binary not working properly |
| cat > "${BT_TEMP_DIR}/${MOCKED_HOSTNAME_BIN}.mock_side_effects" <<"EOF" |
| exit 1 |
| EOF |
| |
| check-fuchsia-ssh-config |
| BT_EXPECT_GOOD_STATUS $? |
| |
| # shellcheck disable=SC1090 |
| source "${BT_TEMP_DIR}/${MOCKED_SSH_KEYGEN_BIN}.mock_state.1" |
| expected_cmd_line=( "${BT_TEMP_DIR}/${MOCKED_SSH_KEYGEN_BIN}" -P "" -t ed25519 -f "${BT_TEMP_DIR}/test-ssh-keygen-home/.ssh/fuchsia_ed25519" -C "nouser@nohostname Generated by Fuchsia GN SDK" ) |
| BT_EXPECT_EQ "${expected_cmd_line[*]}" "${BT_MOCK_ARGS[*]}" |
| |
| export USER="${user}" |
| } |
| |
| TEST_ssh-cmd() { |
| BT_ASSERT_FUNCTION_EXISTS ssh-cmd |
| cat > "${BT_TEMP_DIR}/${MOCKED_SSH_BIN}.mock_side_effects" <<"EOF" |
| echo "$@" |
| EOF |
| ssh-cmd remote-host ls -l > /dev/null |
| BT_EXPECT_GOOD_STATUS $? |
| # shellcheck disable=SC1090 |
| source "${BT_TEMP_DIR}/${MOCKED_SSH_BIN}.mock_state" |
| EXPECTED_SSH_CMD_LINE=("${BT_TEMP_DIR}/${MOCKED_SSH_BIN}" "-F" "${FUCHSIA_WORK_DIR}/sshconfig" "remote-host" "ls" "-l") |
| BT_EXPECT_EQ "${EXPECTED_SSH_CMD_LINE[*]}" "${BT_MOCK_ARGS[*]}" |
| } |
| |
| |
| TEST_get-device-name() { |
| BT_ASSERT_FUNCTION_EXISTS get-device-name |
| cat > "${MOCKED_DEVICE_FINDER}.mock_side_effects" <<"EOF" |
| echo fe80::4607:bff:fe69:b53e%enx44070b69b53f atom-device-name-mocked |
| EOF |
| DEVICE_NAME="$(get-device-name)" |
| BT_EXPECT_EQ "${DEVICE_NAME}" "atom-device-name-mocked" |
| } |
| |
| TEST_get-device-ip-by-name() { |
| BT_ASSERT_FUNCTION_EXISTS get-device-ip-by-name |
| MOCK_DEVICE="atom-device-name-mocked" |
| get-device-ip-by-name "${MOCK_DEVICE}" |
| # shellcheck disable=SC1090 |
| source "${MOCKED_DEVICE_FINDER}.mock_state" |
| EXPECTED_DEVICE_FINDER_CMD_LINE=("${MOCKED_DEVICE_FINDER}" "resolve" "-device-limit" "1" "-ipv4=false" "${MOCK_DEVICE}") |
| BT_EXPECT_EQ "${EXPECTED_DEVICE_FINDER_CMD_LINE[*]}" "${BT_MOCK_ARGS[*]}" |
| } |
| |
| TEST_get-device-ip-by-name-no-args() { |
| BT_ASSERT_FUNCTION_EXISTS get-device-ip-by-name |
| BT_EXPECT get-device-ip-by-name > /dev/null |
| # shellcheck disable=SC1090 |
| source "${MOCKED_DEVICE_FINDER}.mock_state" |
| EXPECTED_DEVICE_FINDER_CMD_LINE=("${MOCKED_DEVICE_FINDER}" "list" "-device-limit" "1" "-ipv4=false") |
| BT_EXPECT_EQ "${EXPECTED_DEVICE_FINDER_CMD_LINE[*]}" "${BT_MOCK_ARGS[*]}" |
| } |
| |
| TEST_get-device-ip() { |
| BT_ASSERT_FUNCTION_EXISTS get-device-ip |
| MOCK_DEVICE="atom-device-name-mocked" |
| BT_EXPECT get-device-ip |
| # shellcheck disable=SC1090 |
| source "${MOCKED_DEVICE_FINDER}.mock_state" |
| EXPECTED_DEVICE_FINDER_CMD_LINE=("${MOCKED_DEVICE_FINDER}" "list" "-device-limit" "1" "-ipv4=false") |
| BT_EXPECT_EQ "${EXPECTED_DEVICE_FINDER_CMD_LINE[*]}" "${BT_MOCK_ARGS[*]}" |
| } |
| |
| TEST_get-sdk-version() { |
| BT_ASSERT_FUNCTION_EXISTS get-sdk-version |
| SDK_VERSION="$(get-sdk-version)" |
| BT_EXPECT_EQ "${SDK_VERSION}" "8890373976687374912" |
| } |
| |
| TEST_run-gsutil() { |
| BT_ASSERT_FUNCTION_EXISTS run-gsutil |
| cat > "${BT_TEMP_DIR}/${MOCKED_GSUTIL}.mock_side_effects" <<EOF |
| echo "gs://fuchsia/development/LATEST" |
| EOF |
| RESULT="$(run-gsutil ls gs://fuchsia/development/LATEST)" |
| BT_EXPECT_EQ "${RESULT}" "gs://fuchsia/development/LATEST" |
| } |
| |
| TEST_run-gsutil-not-found() { |
| # override the builtin command which is used to |
| # find programs via the PATH environment variable. |
| BT_EXPECT_EQ "$(type -t command)" "builtin" |
| command() { |
| return 1 |
| } |
| |
| # Capture the return code and any output. |
| rc=0 |
| RESULT="$(run-gsutil ls gs://fuchsia/development 2>&1)" |
| rc=$? |
| |
| BT_EXPECT_EQ $rc 1 |
| BT_EXPECT_EQ "${RESULT}" "ERROR: Cannot find gsutil." |
| } |
| |
| TEST_run-cipd() { |
| BT_ASSERT_FUNCTION_EXISTS run-cipd |
| cat > "${BT_TEMP_DIR}/${MOCKED_CIPD}.mock_side_effects" <<EOF |
| echo "fuchsia/" |
| EOF |
| RESULT="$(run-cipd ls)" |
| BT_EXPECT_EQ "${RESULT}" "fuchsia/" |
| } |
| |
| TEST_run-cipd-not-found() { |
| # override the builtin command which is used to |
| # find programs via the PATH environment variable. |
| BT_EXPECT_EQ "$(type -t command)" "builtin" |
| command() { |
| return 1 |
| } |
| |
| # Capture the return code and any output. |
| rc=0 |
| RESULT="$(run-cipd ls 2>&1)" |
| rc=$? |
| |
| BT_EXPECT_EQ $rc 1 |
| BT_EXPECT_EQ "${RESULT}" "ERROR: Cannot find cipd." |
| } |
| |
| TEST_get-available-images() { |
| BT_ASSERT_FUNCTION_EXISTS get-available-images |
| cat > "${BT_TEMP_DIR}/${MOCKED_GSUTIL}.mock_side_effects" <<"EOF" |
| if [[ "${2}" == gs://fuchsia* ]]; then |
| echo "gs://fuchsia/development/sdk_id/images/image1.tgz" |
| echo "gs://fuchsia/development/sdk_id/images/image2.tgz" |
| echo "gs://fuchsia/development/sdk_id/images/image3.tgz" |
| elif [[ "${2}" == gs://other* ]]; then |
| echo "gs://other/development/sdk_id/images/image4.tgz" |
| echo "gs://other/development/sdk_id/images/image5.tgz" |
| echo "gs://other/development/sdk_id/images/image6.tgz" |
| else |
| echo "CommandException: One or more URLs matched no objects." |
| exit 1 |
| fi |
| EOF |
| RESULT_LIST=() |
| IFS=' ' read -r -a RESULT_LIST <<< "$(get-available-images "sdk_id")" |
| BT_EXPECT_EQ "${RESULT_LIST[*]}" "image1 image2 image3" |
| |
| IFS=' ' read -r -a RESULT_LIST <<< "$(get-available-images "sdk_id" "other")" |
| BT_EXPECT_EQ "${RESULT_LIST[*]}" "image4 image5 image6 image1 image2 image3" |
| |
| BT_EXPECT_FAIL get-available-images "sdk_id" "invalid" |
| } |
| |
| TEST_kill-running-pm_not_found() { |
| cat > "${BT_TEMP_DIR}/${MOCKED_PGREP}.mock_side_effects" <<"EOF" |
| echo "" |
| EOF |
| |
| BT_EXPECT kill-running-pm 2> "${BT_TEMP_DIR}/kill-running-pm_output.txt" |
| BT_EXPECT_FILE_CONTAINS "${BT_TEMP_DIR}/kill-running-pm_output.txt" "WARNING: existing pm process not found" |
| } |
| |
| TEST_kill-running-pm_found() { |
| if is-mac; then |
| pgrep_result="987654321" |
| else |
| pgrep_result="987654321 /path/tools/pm" |
| fi |
| cat > "${BT_TEMP_DIR}/${MOCKED_PGREP}.mock_side_effects" <<EOF |
| echo "${pgrep_result}" |
| EOF |
| |
| BT_EXPECT kill-running-pm 2> "${BT_TEMP_DIR}/kill-running-pm_output.txt" |
| BT_EXPECT_FILE_CONTAINS "${BT_TEMP_DIR}/kill-running-pm_output.txt" "WARNING: Killing existing pm process" |
| |
| # shellcheck disable=SC1090 |
| source "${BT_TEMP_DIR}/${MOCKED_KILL}.mock_state" |
| gn-test-check-mock-args "_ANY_" "-9" 987654321 |
| } |
| |
| TEST_get-fuchsia-property-names() { |
| # Don't copy the property names here, just confirm it is a list and they are valid. |
| BT_ASSERT_FUNCTION_EXISTS get-fuchsia-property-names |
| BT_ASSERT_FUNCTION_EXISTS is-valid-fuchsia-property |
| |
| IFS=" " read -r -a prop_list <<< "$(get-fuchsia-property-names)" |
| |
| # There should be between 1 and 10 properties |
| BT_ASSERT "(( ${#prop_list[@]} > 1 && ${#prop_list[@]} <= 10 ))" |
| |
| for prop in "${prop_list[@]}"; do |
| BT_ASSERT is-valid-fuchsia-property "${prop}" |
| done |
| } |
| |
| TEST_migrate-properties_no_existing_props() { |
| # called by get-fuchsia-property. |
| name="$(get-fuchsia-property device-name)" |
| BT_EXPECT_GOOD_STATUS $? |
| } |
| |
| set-old-fuchsia-property() { |
| local prop_path |
| prop_path="$(get-fuchsia-sdk-data-dir)/.properties/$1.txt" |
| if ! mkdir -p "$(dirname "${prop_path}")"; then |
| fx-error "Cannot write property to $prop_path" |
| exit 1 |
| fi |
| echo "$2" > "${prop_path}" |
| } |
| |
| TEST_migrate-properties_with_existing_props() { |
| # called by get-fuchsia-property. |
| |
| set-old-fuchsia-property "device-name" "test-device" |
| set-old-fuchsia-property "bucket" "test-bucket" |
| set-old-fuchsia-property "device-ip" "test-ip" |
| set-old-fuchsia-property "image" "test-image" |
| set-old-fuchsia-property "emu-image" "test-emu-image" |
| set-old-fuchsia-property "emu-bucket" "test-emu-bucket" |
| |
| name="$(get-fuchsia-property device-name)" |
| BT_EXPECT_GOOD_STATUS $? |
| # Not checking the value of $name since properties are stored |
| # using ffx which is mocked. |
| } |
| |
| TEST_is-valid-fuchsia-property() { |
| BT_ASSERT is-valid-fuchsia-property "device-ip" |
| BT_ASSERT_FAIL is-valid-fuchsia-property "random-value" |
| } |
| |
| TEST_migrate_ssh_key() { |
| BT_ASSERT_FUNCTION_EXISTS get-fuchsia-auth-keys-file |
| |
| # Generate a key in the old location |
| legacy_ssh_dir="$(get-fuchsia-sdk-data-dir)/.ssh" |
| local legacy_keyfile="${legacy_ssh_dir}/pkey" |
| legacy_authfile="${legacy_ssh_dir}/authorized_keys" |
| mkdir -p "${legacy_ssh_dir}" |
| echo "legacy private key" > "${legacy_keyfile}" |
| echo "legacy authorized keys" > "${legacy_authfile}" |
| |
| local authfile |
| authfile="$(get-fuchsia-auth-keys-file)" |
| BT_EXPECT_EQ "${authfile}" "${HOME}/.ssh/fuchsia_authorized_keys" |
| BT_ASSERT_FILE_CONTAINS "${authfile}" "legacy authorized keys" |
| |
| local keyfile="${HOME}/.ssh/fuchsia_ed25519" |
| BT_ASSERT_FILE_CONTAINS "${keyfile}" "legacy private key" |
| } |
| |
| TEST_get-fuchsia-sdk-tools-dir() { |
| BT_ASSERT_FUNCTION_EXISTS get-fuchsia-sdk-tools-dir |
| cat > "${BT_TEMP_DIR}/${MOCKED_UNAME}.mock_side_effects" <<"EOF" |
| echo "x86_64" |
| EOF |
| |
| local dir |
| dir="$(get-fuchsia-sdk-tools-dir)" |
| BT_EXPECT_EQ "${dir}" "${BT_TEMP_DIR}/scripts/sdk/gn/base/tools/x64" |
| |
| cat > "${BT_TEMP_DIR}/${MOCKED_UNAME}.mock_side_effects" <<"EOF" |
| echo "aarch64" |
| EOF |
| |
| dir="$(get-fuchsia-sdk-tools-dir)" |
| BT_EXPECT_EQ "${dir}" "${BT_TEMP_DIR}/scripts/sdk/gn/base/tools/arm64" |
| |
| cat > "${BT_TEMP_DIR}/${MOCKED_UNAME}.mock_side_effects" <<"EOF" |
| echo "armv8b" |
| EOF |
| |
| dir="$(get-fuchsia-sdk-tools-dir)" |
| BT_EXPECT_EQ "${dir}" "${BT_TEMP_DIR}/scripts/sdk/gn/base/tools/arm64" |
| |
| cat > "${BT_TEMP_DIR}/${MOCKED_UNAME}.mock_side_effects" <<"EOF" |
| echo "custom-cpu" |
| EOF |
| |
| dir="$(get-fuchsia-sdk-tools-dir)" |
| BT_EXPECT_EQ "${dir}" "${BT_TEMP_DIR}/scripts/sdk/gn/base/tools/custom-cpu" |
| } |
| |
| BT_RUN_TESTS "$@" |