#!/bin/bash
# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
if [ $# -eq 0 ]; then
echo "Error: Please provide the name of the local test runner arg file"
exit 1
fi
local_runner_args=$1
source "$local_runner_args"
function create_output_folder() {
local prefix="run_"
local random_string=$RANDOM
local filename="${prefix}${random_string}"
mkdir "$filename"
mkdir "${filename}/iossim"
mkdir "${filename}/output"
echo "$filename"
}
function validate_required_variables() {
local variables_list=("$@") # Get the list of variable names passed
for var_name in "${variables_list[@]}"; do
if [ -z "${!var_name}" ]; then
echo "Error: variable '$var_name' is not set"
exit 1
fi
done
}
common_variables=(
path
xcode_path
mac_toolchain_cmd
target
)
validate_required_variables "${common_variables[@]}"
# validate Xcode and iOS versions
xcode_plist_file="${xcode_path}/Contents/version.plist"
if [ -f $xcode_plist_file ]; then
xcode_build_version=$( /usr/libexec/PlistBuddy \
-c "Print :ProductBuildVersion" \
"$xcode_plist_file" )
sim_plist_file="${xcode_path}/Contents/Developer/Platforms/ \
iPhoneOS.platform/version.plist"
max_sim_ios_version=$( /usr/libexec/PlistBuddy -c "Print :CFBundleVersion" \
"$sim_plist_file" )
if [ ! -z "$version" ] && \
[ "$max_sim_ios_version" != "$version" ] && \
echo -e "$max_sim_ios_version\n$version" | sort -V | head -n 1 | grep -q "^$max_sim_ios_version$"; then
echo "Error: the max simulator version supported in this Xcode is ${max_sim_ios_version}"
exit 1
fi
else
echo "Xcode does not exist in dir ${xcode_path}. "
read -p "What Xcode version would you like to install? (e.g. 15c500b): " \
xcode_build_version
fi
xcode_build_version=$(echo "$xcode_build_version" | tr '[:upper:]' '[:lower:]')
while true; do
echo "Please choose what kind of tests you would like to run:"
echo "1. Unit tests on simulator"
echo "2. EG tests on simulator"
echo "3. Unit tests on physical device"
echo "4. EG tests on physical device"
read -p "Your choice: " choice
# Input validation
if [[ $choice =~ ^[1-4]$ ]]; then # Check if input is a single digit 1-4
echo "You chose: $choice"
break # Exit the loop if input is valid
else
echo "Invalid input. Please enter a number between 1 and 4."
fi
done
gtest_filter_arg=""
if [ -n "$gtest_filter" ]; then
gtest_filter_arg="$gtest_filter_arg--gtest_filter=$gtest_filter"
fi
# Unit tests on simulator
if [ $choice -eq 1 ]; then
echo "Running unit tests on simulator..."
test_variables=(
platform
version
)
validate_required_variables "${test_variables[@]}"
output_folder=$(create_output_folder)
../run.py "$gtest_filter_arg" \
--app $path/$target \
--xcode-path $xcode_path \
--mac-toolchain-cmd $mac_toolchain_cmd \
--runtime-cache-prefix "${output_folder}/Runtime-ios-" \
--iossim "${output_folder}/iossim" \
--platform "$platform" \
--version $version \
--out-dir "${output_folder}/output" \
--xctest \
--xcode-build-version $xcode_build_version
# EG tests on simulator
elif [ $choice -eq 2 ]; then
echo "Running EG tests on simulator..."
test_variables=(
host_app
platform
version
)
validate_required_variables "${test_variables[@]}"
output_folder=$(create_output_folder)
../run.py "$gtest_filter_arg" \
--app $path/$target \
--host-app $path/$host_app \
--xcode-path $xcode_path \
--mac-toolchain-cmd $mac_toolchain_cmd \
--runtime-cache-prefix "${output_folder}/Runtime-ios-" \
--iossim "${output_folder}/iossim" \
--platform "$platform" \
--version $version \
--out-dir "${output_folder}/output" \
--xctest \
--xcode-build-version $xcode_build_version \
--xcodebuild-sim-runner
# Unit tests on physical device
# TODO:(b/328282286): physical device testing is not currently working
# due to idevicefs command issues.
elif [ $choice -eq 3 ]; then
echo "Running unit tests on physical device"
output_folder=$(create_output_folder)
../run.py "$gtest_filter_arg" \
--app $path/$target \
--xcode-path $xcode_path \
--mac-toolchain-cmd $mac_toolchain_cmd \
--runtime-cache-prefix "${output_folder}/Runtime-ios-" \
--iossim "${output_folder}/iossim" \
--out-dir "${output_folder}/output" \
--xctest \
--xcode-build-version $xcode_build_version
# EG tests on physical device
# TODO:(b/328282286): physical device testing is not currently working
# due to idevicefs command issues.
elif [ $choice -eq 4 ]; then
echo "Running EG tests on physical device"
test_variables=(
host_app
)
validate_required_variables "${test_variables[@]}"
output_folder=$(create_output_folder)
../run.py "$gtest_filter_arg" \
--app $path/$target \
--host-app $path/$host_app \
--xcode-path $xcode_path \
--mac-toolchain-cmd $mac_toolchain_cmd \
--runtime-cache-prefix "${output_folder}/Runtime-ios-" \
--iossim "${output_folder}/iossim" \
--out-dir "${output_folder}/output" \
--xctest \
--xcode-build-version $xcode_build_version \
--xcodebuild-device-runner
else
# This should never execute due to the earlier validation
echo "Unexpected error occurred"
exit 1
fi
echo "Tests have finished running. Results are saved in $output_folder"