blob: b046a77e49a7a7c57a3aa6adbc008b2ed601ff5f [file] [log] [blame]
#!/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 that femu is able to correctly interact with the fx emu command and
# its dependencies like fvm and aemu. These tests do not actually start up
# the emulator, but check the arguments are as expected.
set -e
TEST_femu_exec_wrapper() {
# Create femu.sh that fails with output to stderr to check redirection
cat>"${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/femu.sh.mock_side_effects" <<INPUT
echo "Cannot start emulator" > /dev/stderr
return 3
INPUT
# Make fssh never connect, because the emulator did not start
cat>"${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fssh.sh.mock_side_effects" <<INPUT
echo "Cannot connect" > /dev/stderr
# ssh returns 255 when there is a failure to connect to the host.
return 255
INPUT
# Run command, which is expected to fail
BT_EXPECT_FAIL "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/femu-exec-wrapper.sh" \
--femu-log "${BT_TEMP_DIR}/femu.log" > "${BT_TEMP_DIR}/TEST_femu_exec_wrapper_out.txt" 2>&1
# Check that femu.sh was called
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/femu.sh.mock_state"
gn-test-check-mock-args _ANY_ --image qemu-x64 -N
# Check that the stderr from femu.sh was correctly written to the log file
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${BT_TEMP_DIR}/femu.log" "Cannot start emulator"
}
TEST_femu_exec_wrapper_args() {
cat>"${BT_TEMP_DIR}/script.sh.mock_side_effects" <<"INPUT"
# Make sure $1 looks like an ipv6 address
if [[ "${1}" =~ :.*% ]]; then
exit 0
else
exit 4
fi
INPUT
BT_EXPECT "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/femu-exec-wrapper.sh" --exec "${BT_TEMP_DIR}/script.sh" \
--femu-log "${BT_TEMP_DIR}/femu_exec_wrapper_args.log" > "${BT_TEMP_DIR}/TEST_femu_exec_wrapper_args_out.txt" 2>&1
}
TEST_femu_exec_wrapper_multi_pid() {
# Tests cleaning up the emulator when the emu process creates child processes.
# mac uses pgrep and linux uses ps
export PATH="${BT_TEMP_DIR}/isolated:$PATH"
cat>"${BT_TEMP_DIR}/isolated/pgrep.mock_side_effects"<<"INPUT"
if (( "${2}" == "10" )); then
echo "11"
echo "12"
echo "13"
return 0
elif (( "${2}" == "11" )); then
echo "20"
return 0
elif (( "$2" > 20 )); then
echo 10
return 0
fi
return 1
INPUT
cat>"${BT_TEMP_DIR}/isolated/ps.mock_side_effects"<<"INPUT"
if (( "${4}" == "10" )); then
echo "11"
echo "12"
echo "13"
return 0
elif (( "${4}" == "11" )); then
echo "20"
return 0
elif (( "$4" > 20 )); then
echo 10
return 0
fi
return 1
INPUT
# Mock the builtin kill
kill() {
"${BT_TEMP_DIR}/mocked/kill" "$@"
}
export -f kill
BT_EXPECT "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/femu-exec-wrapper.sh" \
--femu-log "${BT_TEMP_DIR}/femu_exec_wrapper_multi_pid.log" > "${BT_TEMP_DIR}/TEST_femu_exec_wrapper_multi_pid_out.txt" 2>&1
if ! is-mac; then
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/isolated/ps.mock_state.1"
gn-test-check-mock-args _ANY_ "-o" "pid:1=" "--ppid" _ANY_
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/isolated/ps.mock_state.2"
# shellcheck disable=SC1090
gn-test-check-mock-args _ANY_ "-o" "pid:1=" "--ppid" "10"
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/isolated/ps.mock_state.3"
gn-test-check-mock-args _ANY_ "-o" "pid:1=" "--ppid" "11"
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/isolated/ps.mock_state.4"
gn-test-check-mock-args _ANY_ "-o" "pid:1=" "--ppid" "20"
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/isolated/ps.mock_state.5"
gn-test-check-mock-args _ANY_ "-o" "pid:1=" "--ppid" "12"
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/isolated/ps.mock_state.6"
gn-test-check-mock-args _ANY_ "-o" "pid:1=" "--ppid" "13"
fi
# read the second mock state since the first kill call is checking to see if the emulator is up and running.
BT_ASSERT_FILE_EXISTS "${BT_TEMP_DIR}/mocked/kill.mock_state.2"
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/mocked/kill.mock_state.2"
# Make sure the call to kill is with multiple args, one per pid and not a string of pids separated by spaces.
# $1 is the pid of the emu process, so it changes each time.
gn-test-check-mock-args _ANY_ "10" "11" "12" "13" "20"
}
TEST_femu_exec_wrapper_with_default_ip_set() {
# This tests making sure the package server is serving to the emulator, and not the default ip address
# set via fconfig.sh.
BT_EXPECT "${FCONFIG_CMD}" set device-ip "192.1.1.2"
BT_EXPECT "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/femu-exec-wrapper.sh" > "${BT_TEMP_DIR}/TEST_femu_exec_wrapper_with_default_ip_set.txt" 2>&1
# Check that femu.sh was called
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fserve.sh.mock_state.1"
gn-test-check-mock-args _ANY_ --device-ip "fe80::5054:ff:fe63:5e7a%qemu" --image qemu-x64
}
# Test initialization. Note that we copy various tools/devshell files and need to replicate the
# behavior of generate.py by copying these files into scripts/sdk/gn/base/bin/devshell
# shellcheck disable=SC2034
BT_FILE_DEPS=(
scripts/sdk/gn/base/bin/fconfig.sh
scripts/sdk/gn/base/bin/femu-exec-wrapper.sh
scripts/sdk/gn/base/bin/fuchsia-common.sh
scripts/sdk/gn/bash_tests/gn-bash-test-lib.sh
)
# shellcheck disable=SC2034
BT_MOCKED_TOOLS=(
scripts/sdk/gn/base/bin/femu.sh
scripts/sdk/gn/base/bin/fssh.sh
scripts/sdk/gn/base/bin/fserve.sh
script.sh
isolated/ps
isolated/pgrep
mocked/kill
)
BT_SET_UP() {
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/scripts/sdk/gn/bash_tests/gn-bash-test-lib.sh"
# 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"
}
BT_RUN_TESTS "$@"