mirror of
https://github.com/YunoHost/package_check.git
synced 2024-09-03 20:06:20 +02:00
198 lines
8 KiB
Bash
198 lines
8 KiB
Bash
#=======================================================================
|
|
# Parse the check_process and generate jsons that describe tests to run
|
|
#=======================================================================
|
|
|
|
# Extract a section found between $1 and $2 from the file $3
|
|
extract_check_process_section () {
|
|
local source_file="${3:-$check_process}"
|
|
local extract=0
|
|
local line=""
|
|
while read line
|
|
do
|
|
# Extract the line
|
|
if [ $extract -eq 1 ]
|
|
then
|
|
# Check if the line is the second line to found
|
|
if echo $line | grep -q "$2"; then
|
|
# Break the loop to finish the extract process
|
|
break;
|
|
fi
|
|
# Copy the line in the partial check_process
|
|
echo "$line"
|
|
fi
|
|
|
|
# Search for the first line
|
|
if echo $line | grep -q "$1"; then
|
|
# Activate the extract process
|
|
extract=1
|
|
fi
|
|
done < "$source_file"
|
|
}
|
|
|
|
|
|
parse_check_process() {
|
|
|
|
log_info "Parsing check_process file"
|
|
|
|
# Remove all commented lines in the check_process
|
|
sed --in-place '/^#/d' "$check_process"
|
|
# Remove all spaces at the beginning of the lines
|
|
sed --in-place 's/^[ \t]*//g' "$check_process"
|
|
|
|
# Extract the Upgrade infos
|
|
extract_check_process_section "^;;; Upgrade options" ";; " > $TEST_CONTEXT/check_process.upgrade_options
|
|
mkdir -p $TEST_CONTEXT/upgrades
|
|
local commit
|
|
for commit in $(cat $TEST_CONTEXT/check_process.upgrade_options | grep "^; commit=.*" | awk -F= '{print $2}')
|
|
do
|
|
cat $TEST_CONTEXT/check_process.upgrade_options | sed -n -e "/^; commit=$commit/,/^;/ p" | grep -v "^;;" > $TEST_CONTEXT/upgrades/$commit
|
|
done
|
|
rm $TEST_CONTEXT/check_process.upgrade_options
|
|
|
|
local test_serie_id="0"
|
|
|
|
# Parse each tests serie
|
|
while read <&3 tests_serie
|
|
do
|
|
test_serie_id=$((test_serie_id+1))
|
|
local test_id=$((test_serie_id * 100))
|
|
local test_serie_rawconf=$TEST_CONTEXT/raw_test_serie_config
|
|
|
|
# Extract the section of the current tests serie
|
|
extract_check_process_section "^$tests_serie" "^;;" > $test_serie_rawconf
|
|
# This is the arg list to be later fed to "yunohost app install"
|
|
# Looking like domain=foo.com&path=/bar&password=stuff
|
|
# "Standard" arguments like domain/path will later be overwritten
|
|
# during tests
|
|
local install_args=$( extract_check_process_section "^; Manifest" "^; " $test_serie_rawconf | sed 's/\s*(.*)$//g' | tr -d '"' | tr '\n' '&')
|
|
local preinstall_template=$(extract_check_process_section "^; pre-install" "^; " $test_serie_rawconf)
|
|
local preupgrade_template=$(extract_check_process_section "^; pre-upgrade" "^; " $test_serie_rawconf)
|
|
|
|
# Add (empty) special args if they ain't provided in check_process
|
|
echo "$install_args" | tr '&' '\n' | grep -q "^domain=" ||install_args+="domain=&"
|
|
echo "$install_args" | tr '&' '\n' | grep -q "^path=" ||install_args+="path=&"
|
|
echo "$install_args" | tr '&' '\n' | grep -q "^admin=" ||install_args+="admin=&"
|
|
echo "$install_args" | tr '&' '\n' | grep -q "^is_public=" ||install_args+="is_public=&"
|
|
echo "$install_args" | tr '&' '\n' | grep -q "^init_main_permission=" ||install_args+="init_main_permission=&"
|
|
|
|
extract_check_process_section "^; Checks" "^; " $test_serie_rawconf > $TEST_CONTEXT/check_process.tests_infos
|
|
|
|
is_test_enabled () {
|
|
# Find the line for the given check option
|
|
local value=$(grep -m1 -o "^$1=." "$TEST_CONTEXT/check_process.tests_infos" | awk -F= '{print $2}')
|
|
# And return this value
|
|
[ "${value:0:1}" = "1" ]
|
|
}
|
|
|
|
add_test() {
|
|
local test_type="$1"
|
|
local test_arg="$2"
|
|
test_id="$((test_id+1))"
|
|
local extra="{}"
|
|
local _install_args="$install_args"
|
|
|
|
# Upgrades with a specific commit
|
|
if [[ "$test_type" == "TEST_UPGRADE" ]] && [[ -n "$test_arg" ]]
|
|
then
|
|
if [ -f "$TEST_CONTEXT/upgrades/$test_arg" ]; then
|
|
local specific_upgrade_install_args="$(grep "^manifest_arg=" "$TEST_CONTEXT/upgrades/$test_arg" | cut -d'=' -f2-)"
|
|
[[ -n "$specific_upgrade_install_args" ]] && _install_args="$specific_upgrade_install_args"
|
|
|
|
local upgrade_name="$(grep "^name=" "$TEST_CONTEXT/upgrades/$test_arg" | cut -d'=' -f2)"
|
|
else
|
|
local upgrade_name="$test_arg"
|
|
fi
|
|
extra="$(jq -n --arg upgrade_name "$upgrade_name" '{ $upgrade_name }')"
|
|
fi
|
|
|
|
jq -n \
|
|
--arg test_serie "$test_serie" \
|
|
--arg test_type "$test_type" \
|
|
--arg test_arg "$test_arg" \
|
|
--arg preinstall_template "$preinstall_template" \
|
|
--arg preupgrade_template "$preupgrade_template" \
|
|
--arg install_args "${_install_args//\"}" \
|
|
--argjson extra "$extra" \
|
|
'{ $test_serie, $test_type, $test_arg, $preinstall_template, $preupgrade_template, $install_args, $extra }' \
|
|
> "$TEST_CONTEXT/tests/$test_id.json"
|
|
}
|
|
|
|
test_serie=${tests_serie//;; }
|
|
|
|
is_test_enabled pkg_linter && add_test "TEST_PACKAGE_LINTER"
|
|
is_test_enabled setup_root && add_test "TEST_INSTALL" "root"
|
|
is_test_enabled setup_sub_dir && add_test "TEST_INSTALL" "subdir"
|
|
is_test_enabled setup_nourl && add_test "TEST_INSTALL" "nourl"
|
|
is_test_enabled setup_private && add_test "TEST_INSTALL" "private"
|
|
is_test_enabled multi_instance && add_test "TEST_INSTALL" "multi"
|
|
is_test_enabled backup_restore && add_test "TEST_BACKUP_RESTORE"
|
|
|
|
# Upgrades
|
|
while IFS= read -r LINE;
|
|
do
|
|
commit="$(echo $LINE | grep -o "from_commit=.*" | awk -F= '{print $2}')"
|
|
add_test "TEST_UPGRADE" "$commit"
|
|
done < <(grep "^upgrade=1" "$TEST_CONTEXT/check_process.tests_infos")
|
|
|
|
# "Advanced" features
|
|
|
|
is_test_enabled change_url && add_test "TEST_CHANGE_URL"
|
|
|
|
# Port already used ... do we really need this ...
|
|
|
|
if grep -q -m1 "port_already_use=1" "$TEST_CONTEXT/check_process.tests_infos"
|
|
then
|
|
local check_port=$(grep -m1 "port_already_use=1" "$TEST_CONTEXT/check_process.tests_infos" | grep -o -E "\([0-9]+\)" | tr -d '()')
|
|
else
|
|
local check_port=6660
|
|
fi
|
|
|
|
is_test_enabled port_already_use && add_test "TEST_PORT_ALREADY_USED" "$check_port"
|
|
|
|
done 3<<< "$(grep "^;; " "$check_process")"
|
|
|
|
return 0
|
|
}
|
|
|
|
guess_test_configuration() {
|
|
|
|
log_error "No tests.toml file found."
|
|
log_warning "Package check will attempt to automatically guess what tests to run."
|
|
|
|
local test_id=100
|
|
|
|
add_test() {
|
|
local test_type="$1"
|
|
local test_arg="$2"
|
|
test_id="$((test_id+1))"
|
|
local extra="{}"
|
|
local preupgrade_template=""
|
|
|
|
jq -n \
|
|
--arg test_serie "default" \
|
|
--arg test_type "$test_type" \
|
|
--arg test_arg "$test_arg" \
|
|
--arg preinstall_template "" \
|
|
--arg preupgrade_template "$preupgrade_template" \
|
|
--arg install_args "$install_args" \
|
|
--argjson extra "$extra" \
|
|
'{ $test_serie, $test_type, $test_arg, $preinstall_template, $preupgrade_template, $install_args, $extra }' \
|
|
> "$TEST_CONTEXT/tests/$test_id.json"
|
|
}
|
|
|
|
local install_args=$(python3 "./lib/default_install_args.py" "$package_path"/manifest.*)
|
|
|
|
add_test "TEST_PACKAGE_LINTER"
|
|
add_test "TEST_INSTALL" "root"
|
|
add_test "TEST_INSTALL" "subdir"
|
|
if echo $install_args | grep -q "is_public=\|init_main_permission="
|
|
then
|
|
add_test "TEST_INSTALL" "private"
|
|
fi
|
|
if grep multi_instance "$package_path"/manifest.* | grep -q true
|
|
then
|
|
add_test "TEST_INSTALL" "multi"
|
|
fi
|
|
add_test "TEST_BACKUP_RESTORE"
|
|
add_test "TEST_UPGRADE"
|
|
}
|