package_check/sub_scripts/testing_process.sh
Maniack Crudelis f663f69f27 Snapshots instead of multiple installations
Usage de snapshot pour les installations de base.
Réduit la durée des tests en évitant de réinstaller l'application plusieurs fois avec les mêmes paramètres.
2017-05-10 22:47:23 +02:00

1406 lines
38 KiB
Bash

#!/bin/bash
echo -e "Loads functions from testing_process.sh"
#=================================================
# Globals variables
#=================================================
# A complete list of backup hooks is available at /usr/share/yunohost/hooks/backup/
backup_hooks="conf_ssowat data_home conf_ynh_firewall conf_cron"
#=================================================
break_before_continue () {
# Make a break if auto_remove is set
if [ $auto_remove -eq 0 ] && [ $bash_mode -ne 1 ]
then
LXC_CONNECT_INFO # Print access information
read -p "Press a key to delete the application and continue...." < /dev/tty
fi
}
#=================================================
# Install and remove an app
#=================================================
SETUP_APP () {
# Install an application in a LXC container
# Install the application in a LXC container
LXC_START "sudo yunohost --debug app install \"$package_dir\" -a \"$manifest_args_mod\""
# yunohost_result gets the return code of the installation
yunohost_result=$?
# Print the result of the install command
if [ $yunohost_result -eq 0 ]; then
ECHO_FORMAT "Installation successful. ($yunohost_result)\n" "white" clog
else
ECHO_FORMAT "Installation failed. ($yunohost_result)\n" "white" clog
fi
# Check all the witness files, to verify if them still here
check_witness_files
# Retrieve the app id in the log. To manage the app after
ynh_app_id=$(sudo tac "$yunohost_log" | grep --only-matching --max-count=1 "YNH_APP_INSTANCE_NAME=[^ ]*" | cut --delimiter='=' --fields=2)
# Analyse the log to extract "warning" and "error" lines
LOG_EXTRACTOR
}
STANDARD_SETUP_APP () {
# Try to find an existing snapshot for this install, or make an install
# If it's a root install
if [ "$check_path" = "/" ]
then
# Check if a snapshot already exist for this install
if [ -z "$root_snapshot" ]
then
# Make an installation
SETUP_APP
# Then create a snapshot
ECHO_FORMAT "Create a snapshot for root installation.\n" "white" clog
root_snapshot=$(create_temp_backup)
else
# Or uses an existing snapshot
ECHO_FORMAT "Uses an existing snapshot for root installation.\n" "white" clog
use_temp_snapshot $root_snapshot
fi
# In case of sub path install, use another snapshot
else
# Check if a snapshot already exist for this install
if [ -z "$subpath_snapshot" ]
then
# Make an installation
SETUP_APP
# Then create a snapshot
ECHO_FORMAT "Create a snapshot for sub path installation.\n" "white" clog
subpath_snapshot=$(create_temp_backup)
else
# Or uses an existing snapshot
ECHO_FORMAT "Uses an existing snapshot for sub path installation.\n" "white" clog
use_temp_snapshot $subpath_snapshot
fi
fi
}
REMOVE_APP () {
# Remove an application
# Make a break if auto_remove is set
break_before_continue
ECHO_FORMAT "\nDeleting...\n" "white" "bold" clog
# Remove the application from the LXC container
LXC_START "sudo yunohost --debug app remove \"$ynh_app_id\""
# yunohost_remove gets the return code of the deletion
yunohost_remove=$?
# Print the result of the remove command
if [ "$yunohost_remove" -eq 0 ]; then
ECHO_FORMAT "Deleting successful. ($yunohost_remove)\n" "white" clog
else
ECHO_FORMAT "Deleting failed. ($yunohost_remove)\n" "white" clog
fi
# Check all the witness files, to verify if them still here
check_witness_files
}
#=================================================
# Try to access the app by its url
#=================================================
CHECK_URL () {
# Try to access the app by its url
if [ $use_curl -eq 1 ]
then
ECHO_FORMAT "\nTry to access by url...\n" "white" "bold"
# Force a skipped_uris if public mode is not set
if [ -z "$public_arg" ]
then
# Add a skipped_uris on / for the app
LXC_START "sudo yunohost app setting \"$ynh_app_id\" skipped_uris -v \"/\""
# Regen the config of sso
LXC_START "sudo yunohost app ssowatconf"
ECHO_FORMAT "Public access forced by a skipped_uris to check.\n" "lyellow" "bold"
fi
# Inform /etc/hosts with the IP of LXC to resolve the domain.
# This is set only here and not before to prevent to help the app's scripts
echo -e "$ip_range.2 $main_domain #package_check\n$ip_range.2 $sub_domain #package_check" | sudo tee --append /etc/hosts > /dev/null
# Try to resolv the domain during 10 seconds maximum.
local i=0
for i in `seq 1 10`; do
curl --location --insecure $check_domain > /dev/null 2>&1
# If curl return 6, it's an error "Could not resolve host"
if [ $? -ne 6 ]; then
# If not, curl is ready to work.
break
fi
echo -n .
sleep 1
done
# curl_error indicate the result of curl test
curl_error=0
# 503 Service Unavailable can would have some time to work.
local http503=0
# yuno_portal equal 1 if the test fall on the portal
yuno_portal=0
# Try to access to the url in 2 times, with a final / and without
i=1; while [ $i -ne 3 ]
do
# First time, try without final /
if [ $i -eq 1 ]
then
# If the last character is /
if [ "${check_path: -1}" = "/" ]
then
# Remove it
local curl_check_path="${check_path:0:${#check_path}-1}"
else
curl_check_path=$check_path
fi
# The next loop will try the second test
i=2
elif [ $i -eq 2 ]
then
# Second time, try with the final /
# If the last character isn't /
if [ "${check_path: -1}" != "/" ]
then
# Add it
curl_check_path="$check_path/"
else
curl_check_path=$check_path
fi
# The next loop will break the while loop
i=3
fi
# Remove the previous curl output
rm -f "$script_dir/url_output"
# Call curl to try to access to the url of the app
curl --location --insecure --silent --show-error --write-out "%{http_code};%{url_effective}\n" $check_domain$curl_check_path --output "$script_dir/url_output" > "$script_dir/curl_print"
# Analyze the result of curl command
if [ $? -ne 0 ]
then
ECHO_FORMAT "Connection error...\n" "red" "bold"
curl_error=1
fi
# Print informations about the connection
ECHO_FORMAT "Test url: $check_domain$curl_check_path\n" "white"
ECHO_FORMAT "Real url: $(cat "$script_dir/curl_print" | cut --delimiter=';' --fields=2)\n" "white"
local http_code=$(cat "$script_dir/curl_print" | cut -d ';' -f1)
ECHO_FORMAT "HTTP code: $http_code\n" "white"
# Analyze the http code
if [ "${http_code:0:1}" = "0" ] || [ "${http_code:0:1}" = "4" ] || [ "${http_code:0:1}" = "5" ]
then
# If the http code is a 0xx 4xx or 5xx, it's an error code.
curl_error=1
# 401 is "Unauthorized", so is a answer of the server. So, it works!
test "${http_code}" = "401" && curl_error=0
# 503 is Service Unavailable, it's a temporary error.
if [ "${http_code}" = "503" ]
then
curl_error=0
ECHO_FORMAT "Service temporarily unavailable\n" "lyellow" "bold"
# 3 successive error are allowed
http503=$(( http503 + 1 ))
if [ $http503 -eq 3 ]; then
# Over 3, it's definitively an error
curl_error=1
else
# Below 3 times, retry.
# Decrease the value of 'i' to retry the same test
i=$(( i - 1 ))
# Wait 1 second to let's some time to the 503 error
sleep 1
# And retry immediately
continue
fi
fi
if [ $curl_error -eq 1 ]; then
ECHO_FORMAT "The HTTP code show an error.\n" "white" "bold" clog
fi
fi
# Analyze the output of curl
if [ -e "$script_dir/url_output" ]
then
# Print the title of the page
local url_title=$(grep "<title>" "$script_dir/url_output" | cut --delimiter='>' --fields=2 | cut --delimiter='<' --fields=1)
ECHO_FORMAT "Title of the page: $url_title\n" "white"
# Check if the page title is neither the YunoHost portail or default nginx page
if [ "$url_title" = "YunoHost Portal" ]
then
ECHO_FORMAT "The connection attempt fall on the YunoHost portal.\n" "white" "bold" clog
yuno_portal=1
else
yuno_portal=0
if [ "$url_title" = "Welcome to nginx on Debian!" ]
then
# Falling on nginx default page is an error.
curl_error=1
ECHO_FORMAT "The connection attempt fall on nginx default page.\n" "white" "bold" clog
fi
# Print the first 20 lines of the body
ECHO_FORMAT "Extract of the body:\n" "white"
echo -e "\e[37m" # Write in 'light grey'
grep "<body" --after-context=20 "$script_dir/url_output" | sed 1d | tee --append "$test_result"
echo -e "\e[0m"
fi
fi
done
# Remove the entries in /etc/hosts for the test domain
sudo sed --in-place '/#package_check/d' /etc/hosts
else
# If use_curl is set to 0, the url will not tried
ECHO_FORMAT "Connexion attempt aborted.\n" "white"
curl_error=0
yuno_portal=0
fi
}
#=================================================
# Generic functions for unit tests
#=================================================
unit_test_title () {
# Print a title for the test
# $1 = Name of the test
ECHO_FORMAT "\n\n>> $1 [Test $cur_test/$all_test]\n" "white" "bold" clog
# Increment the value of the current test
cur_test=$((cur_test+1))
}
check_manifest_key () {
# Check if a manifest key is set
# $1 = manifest key
if [ -z "${1}_arg" ]
then
ECHO_FORMAT "Unable to find a manifest key for '${1,,}' in the check_process file. Impossible to perform this test\n" "red" clog
return 1
fi
}
replace_manifest_key () {
# Replace a generic manifest key by another
# $1 = Manifest key
# $2 = Replacement value
# Build the variable name by concatenate $1 and _arg
local manifest_key=$(eval echo \$${1}_arg)
if [ -n "$manifest_key" ]
then
manifest_args_mod=$(echo $manifest_args_mod | sed "s@$manifest_key=[^&]*\&@${manifest_key}=${2}\&@")
fi
}
check_success () {
ECHO_FORMAT "--- SUCCESS ---\n" "lgreen" "bold"
}
check_failed () {
ECHO_FORMAT "--- FAIL ---\n" "red" "bold"
}
check_test_result () {
# Check the result and print SUCCESS or FAIL
if [ $yunohost_result -eq 0 ] && [ $curl_error -eq 0 ] && [ $yuno_portal -eq 0 ]
then
check_success
return 0
else
check_failed
return 1
fi
}
check_test_result_remove () {
# Check the result of a remove and print SUCCESS or FAIL
if [ $yunohost_remove -eq 0 ]
then
check_success
return 0
else
check_failed
return 1
fi
}
is_install_failed () {
# Check if an install have previously work
if [ $RESULT_check_root -eq 1 ]
then
# If root installation worked, return root.
echo root
elif [ $RESULT_check_sub_dir -eq 1 ] && [ $force_install_ok -ne 1 ]
then
# If subdir installation worked or force_install_ok setted, return subdir.
echo subdir
else
ECHO_FORMAT "All installs failed, impossible to perform this test...\n" "red" clog
return 1
fi
}
#=================================================
# Unit tests
#=================================================
CHECK_SETUP () {
# Try to install in a sub path, on root or without url access
# $1 = install type
local install_type=$1
if [ "$install_type" = "subdir" ]; then
unit_test_title "Installation in a sub path..."
elif [ "$install_type" = "root" ]; then
unit_test_title "Installation on the root..."
else
unit_test_title "Installation without url access..."
# Disable the curl test
use_curl=0
fi
# Check if the needed manifest key are set or abort the test
if [ "$install_type" != "no_url" ]; then
check_manifest_key "domain" || return
check_manifest_key "path" || return
fi
# Copy original arguments
local manifest_args_mod="$manifest_arguments"
# Replace manifest key for the test
check_domain=$sub_domain
replace_manifest_key "domain" "$check_domain"
if [ "$install_type" = "subdir" ]; then
local check_path=$test_path
elif [ "$install_type" = "root" ]; then
local check_path=/
fi
replace_manifest_key "path" "$check_path"
replace_manifest_key "user" "$test_user"
replace_manifest_key "public" "$public_public_arg"
# Install the application in a LXC container
STANDARD_SETUP_APP
# Try to access the app by its url
CHECK_URL
# Check the result and print SUCCESS or FAIL
if check_test_result
then # Success
RESULT_global_setup=1 # Installation succeed
local check_result_setup=1 # Installation in a sub path succeed
else # Fail
# The global success for a installation can't be failed if another installation succeed
if [ $RESULT_global_setup -ne 1 ]; then
RESULT_global_setup=-1 # Installation failed
fi
local check_result_setup=-1 # Installation in a sub path failed
fi
# Remove the application
REMOVE_APP
# Analyse the log to extract "warning" and "error" lines
LOG_EXTRACTOR
# Check the result and print SUCCESS or FAIL
if check_test_result_remove
then # Success
local check_result_remove=1 # Remove in sub path succeed
RESULT_global_remove=1 # Remove succeed
else # Fail
# The global success for a deletion can't be failed if another remove succeed
if [ $RESULT_global_remove -ne 1 ]; then
RESULT_global_remove=-1 # Remove failed
fi
local check_result_remove=-1 # Remove in sub path failed
fi
# Fill the correct variable depend on the type of test
if [ "$install_type" = "subdir" ]
then
RESULT_check_sub_dir=$check_result_setup
RESULT_check_remove_sub_dir=$check_result_remove
else # root and no_url
RESULT_check_root=$check_result_setup
RESULT_check_remove_root=$check_result_remove
fi
}
CHECK_UPGRADE () {
# Try the upgrade script
unit_test_title "Upgrade..."
# Check if an install have previously work
local previous_install=$(is_install_failed)
# Abort if none install worked
[ "$previous_install" = "1" ] && return
# Copy original arguments
local manifest_args_mod="$manifest_arguments"
# Replace manifest key for the test
check_domain=$sub_domain
replace_manifest_key "domain" "$check_domain"
# Use a path according to previous succeeded installs
if [ "$previous_install" = "subdir" ]; then
local check_path=$test_path
elif [ "$previous_install" = "root" ]; then
local check_path=/
fi
replace_manifest_key "path" "$check_path"
replace_manifest_key "user" "$test_user"
replace_manifest_key "public" "$public_public_arg"
# Install the application in a LXC container
ECHO_FORMAT "\nPreliminary install...\n" "white" "bold" clog
STANDARD_SETUP_APP
# Check if the install had work
if [ $yunohost_result -ne 0 ]
then
ECHO_FORMAT "\nInstallation failed...\n" "red" "bold"
else
ECHO_FORMAT "\nUpgrade on the same version...\n" "white" "bold" clog
# Upgrade the application in a LXC container
LXC_START "sudo yunohost --debug app upgrade $ynh_app_id -f \"$package_dir\""
# yunohost_result gets the return code of the upgrade
yunohost_result=$?
# Print the result of the upgrade command
if [ $yunohost_result -eq 0 ]; then
ECHO_FORMAT "Upgrade successful. ($yunohost_result)\n" "white" clog
else
ECHO_FORMAT "Upgrade failed. ($yunohost_result)\n" "white" clog
fi
# Check all the witness files, to verify if them still here
check_witness_files
# Analyse the log to extract "warning" and "error" lines
LOG_EXTRACTOR
# Try to access the app by its url
CHECK_URL
fi
# Check the result and print SUCCESS or FAIL
if check_test_result
then # Success
RESULT_check_upgrade=1 # Upgrade succeed
else # Fail
RESULT_check_upgrade=-1 # Upgrade failed
fi
# Remove the application
REMOVE_APP
}
CHECK_PUBLIC_PRIVATE () {
# Try to install in public or private mode
# $1 = install type
local install_type=$1
if [ "$install_type" = "private" ]; then
unit_test_title "Installation in private mode..."
else [ "$install_type" = "public" ]
unit_test_title "Installation in public mode..."
fi
# Check if the needed manifest key are set or abort the test
check_manifest_key "public" || return
check_manifest_key "public_public" || return
check_manifest_key "public_private" || return
# Check if an install have previously work
local previous_install=$(is_install_failed)
# Abort if none install worked
[ "$previous_install" = "1" ] && return
# Copy original arguments
local manifest_args_mod="$manifest_arguments"
# Replace manifest key for the test
check_domain=$sub_domain
replace_manifest_key "domain" "$check_domain"
replace_manifest_key "user" "$test_user"
# Set public or private according to type of test requested
if [ "$install_type" = "private" ]; then
replace_manifest_key "public" "$public_private_arg"
elif [ "$install_type" = "public" ]; then
replace_manifest_key "public" "$public_public_arg"
fi
# Initialize the value
local check_result_public_private=0
# Try in 2 times, first in root and second in sub path.
local i=0
for i in 0 1
do
# First, try with a root install
if [ $i -eq 0 ]
then
# Check if root installation worked, or if force_install_ok is setted.
if [ $RESULT_check_root -eq 1 ] && [ $force_install_ok -ne 1 ]
then
# Replace manifest key for path
local check_path=/
replace_manifest_key "path" "$check_path"
else
# Jump to the second path if this check cannot be do
ECHO_FORMAT "Root install failed, impossible to perform this test...\n" "lyellow" clog
continue
fi
# Second, try with a sub path install
elif [ $i -eq 1 ]
then
# Check if sub path installation worked, or if force_install_ok is setted.
if [ $RESULT_check_sub_dir -eq 1 ] && [ $force_install_ok -ne 1 ]
then
# Replace manifest key for path
local check_path=$test_path
replace_manifest_key "path" "$check_path"
else
# Jump to the second path if this check cannot be do
ECHO_FORMAT "Sub path install failed, impossible to perform this test...\n" "lyellow" clog
return
fi
fi
# Install the application in a LXC container
SETUP_APP
# Try to access the app by its url
CHECK_URL
# Change the result according to the results of the curl test
if [ "$install_type" = "private" ]
then
# In private mode, if curl doesn't fell on the ynh portal, it's a fail.
if [ $yuno_portal -eq 0 ]; then
yunohost_result=1
fi
elif [ "$install_type" = "public" ]
then
# In public mode, if curl fell on the ynh portal, it's a fail.
if [ $yuno_portal -eq 1 ]; then
yunohost_result=1
fi
fi
# Check the result and print SUCCESS or FAIL
if [ $yunohost_result -eq 0 ] && [ $curl_error -eq 0 ]
then # Success
check_success
# The global success for public/private mode can't be a success if another installation failed
if [ $check_result_public_private -ne -1 ]; then
check_result_public_private=1 # Installation succeed
fi
else # Fail
check_failed
check_result_public_private=-1 # Installation failed
fi
# Fill the correct variable depend on the type of test
if [ "$install_type" = "private" ]
then
RESULT_check_private=$check_result_public_private
else # public
RESULT_check_public=$check_result_public_private
fi
# Make a break if auto_remove is set
break_before_continue
# Stop and restore the LXC container
LXC_STOP
done
}
CHECK_MULTI_INSTANCE () {
# Try multi-instance installations
unit_test_title "Multi-instance installations..."
# Check if the sub path install have previously work
if [ $RESULT_check_sub_dir -ne 1 ] && [ $force_install_ok -ne 1 ]
then
# If subdir installation doesn't worked and force_install_ok not setted, aborted this test.
ECHO_FORMAT "Sub path install failed, impossible to perform this test...\n" "red" clog
return
fi
# Copy original arguments
local manifest_args_mod="$manifest_arguments"
# Replace manifest key for the test
check_domain=$sub_domain
replace_manifest_key "domain" "$check_domain"
replace_manifest_key "user" "$test_user"
replace_manifest_key "public" "$public_public_arg"
# Install 3 times the same app
local i=0
for i in 1 2 3
do
# First installation
if [ $i -eq 1 ]
then
local path_1=$test_path
ECHO_FORMAT "First installation: path=$path_1\n" clog
check_path=$path_1
# Second installation
elif [ $i -eq 2 ]
then
local path_2=$test_path-2
ECHO_FORMAT "Second installation: path=$path_2\n" clog
check_path=$path_2
# Third installation
else
local path_3="/3-${test_path#/}"
ECHO_FORMAT "Third installation: path=$path_3\n" clog
check_path=$path_3
fi
# Replace path manifest key for the test
replace_manifest_key "path" "$check_path"
# Install the application in a LXC container
SETUP_APP
# Store the result in the correct variable
# First installation
if [ $i -eq 1 ]
then
local multi_yunohost_result_1=$yunohost_result
# Second installation
elif [ $i -eq 2 ]
then
local multi_yunohost_result_2=$yunohost_result
# Third installation
else
local multi_yunohost_result_3=$yunohost_result
fi
done
# Try to access to the 3 apps by theirs url
for i in 1 2 3
do
# First app
if [ $i -eq 1 ]
then
check_path=$path_1
# Second app
elif [ $i -eq 2 ]
then
check_path=$path_2
# Third app
else
check_path=$path_3
fi
# Try to access the app by its url
CHECK_URL
# Check the result of curl test
if [ $curl_error -ne 0 ] || [ $yuno_portal -ne 0 ]
then
# The test failed if curl fell on ynh portal or had an error.
# First app
if [ $i -eq 1 ]
then
multi_yunohost_result_1=1
# Second app
elif [ $i -eq 2 ]
then
multi_yunohost_result_2=1
# Third app
else
multi_yunohost_result_3=1
fi
fi
done
# Check the result and print SUCCESS or FAIL
# Succeed if first installation works, and either the second or the third works also
if [ $multi_yunohost_result_1 -eq 0 ] && ( [ $multi_yunohost_result_2 -eq 0 ] || [ $multi_yunohost_result_3 -eq 0 ] )
then # Success
check_success
RESULT_check_multi_instance=1
else # Fail
check_failed
RESULT_check_multi_instance=-1
fi
# Make a break if auto_remove is set
break_before_continue
}
CHECK_COMMON_ERROR () {
# Try to install with specific complications
# $1 = install type
local install_type=$1
if [ "$install_type" = "incorrect_path" ]; then
unit_test_title "Malformed path..."
# Check if the needed manifest key are set or abort the test
check_manifest_key "path" || return
else [ "$install_type" = "port_already_use" ]
unit_test_title "Port already used..."
# Check if the needed manifest key are set or abort the test
check_manifest_key "port" || return
fi
# Check if an install have previously work
local previous_install=$(is_install_failed)
# Abort if none install worked
[ "$previous_install" = "1" ] && return
# Copy original arguments
local manifest_args_mod="$manifest_arguments"
# Replace manifest key for the test
check_domain=$sub_domain
replace_manifest_key "domain" "$check_domain"
replace_manifest_key "user" "$test_user"
replace_manifest_key "public" "$public_public_arg"
# Replace path manifest key for the test
if [ "$install_type" = "incorrect_path" ]; then
# Change the path from /path to path/
local wrong_path=${test_path#/}/
# Use this wrong path only for the arguments that will give to yunohost for installation.
replace_manifest_key "path" "$wrong_path"
local check_path=$test_path
else [ "$install_type" = "port_already_use" ]
# Use a path according to previous succeeded installs
if [ "$previous_install" = "subdir" ]; then
local check_path=$test_path
elif [ "$previous_install" = "root" ]; then
local check_path=/
fi
replace_manifest_key "path" "$check_path"
fi
# Open the specified port to force the script to find another
if [ "$install_type" = "port_already_use" ]
then
# If the first character is a #, that means it this port number is not in the manifest
if [ "${port_arg:0:1}" = "#" ]
then
# Retrieve the port number
local check_port="${port_arg:1}"
# Else, the port number is in the manifest. So the port number is set at a fixed value.
else
local check_port=6660
# Replace port manifest key for the test
replace_manifest_key "port" "$check_port"
fi
# Open the port before the installation
LXC_START "sudo yunohost firewall allow Both $check_port"
fi
# Install the application in a LXC container
SETUP_APP
# Try to access the app by its url
CHECK_URL
# Check the result and print SUCCESS or FAIL
if check_test_result
then # Success
local check_result_setup=1
else # Fail
local check_result_setup=-1
fi
# Fill the correct variable depend on the type of test
if [ "$install_type" = "incorrect_path" ]
then
RESULT_check_path=$check_result_setup
elif [ "$install_type" = "port_already_use" ]; then
RESULT_check_port=$check_result_setup
fi
# Make a break if auto_remove is set
break_before_continue
}
CHECK_BACKUP_RESTORE () {
# Try to backup then restore the app
unit_test_title "Backup/Restore..."
# Check if an install have previously work
local previous_install=$(is_install_failed)
# Abort if none install worked
[ "$previous_install" = "1" ] && return
# Copy original arguments
local manifest_args_mod="$manifest_arguments"
# Replace manifest key for the test
check_domain=$sub_domain
replace_manifest_key "domain" "$check_domain"
replace_manifest_key "user" "$test_user"
replace_manifest_key "public" "$public_public_arg"
# Try in 2 times, first in root and second in sub path.
local i=0
for i in 0 1
do
# First, try with a root install
if [ $i -eq 0 ]
then
# Check if root installation worked, or if force_install_ok is setted.
if [ $RESULT_check_root -eq 1 ] && [ $force_install_ok -ne 1 ]
then
# Replace manifest key for path
local check_path=/
replace_manifest_key "path" "$check_path"
ECHO_FORMAT "\nPreliminary installation on the root...\n" "white" "bold" clog
else
# Jump to the second path if this check cannot be do
ECHO_FORMAT "Root install failed, impossible to perform this test...\n" "lyellow" clog
continue
fi
# Second, try with a sub path install
elif [ $i -eq 1 ]
then
# Check if sub path installation worked, or if force_install_ok is setted.
if [ $RESULT_check_sub_dir -eq 1 ] && [ $force_install_ok -ne 1 ]
then
# Replace manifest key for path
local check_path=$test_path
replace_manifest_key "path" "$check_path"
ECHO_FORMAT "\nPreliminary installation in a sub path...\n" "white" "bold" clog
else
# Jump to the second path if this check cannot be do
ECHO_FORMAT "Sub path install failed, impossible to perform this test...\n" "lyellow" clog
return
fi
fi
# Install the application in a LXC container
STANDARD_SETUP_APP
# BACKUP
# Made a backup if the installation succeed
if [ $yunohost_result -ne 0 ]
then
ECHO_FORMAT "\nInstallation failed...\n" "red" "bold"
else
ECHO_FORMAT "\nBackup of the application...\n" "white" "bold" clog
# Made a backup of the application
LXC_START "sudo yunohost --debug backup create -n Backup_test --apps $ynh_app_id --hooks $backup_hooks"
# yunohost_result gets the return code of the backup
yunohost_result=$?
# Print the result of the backup command
if [ $yunohost_result -eq 0 ]; then
ECHO_FORMAT "Backup successful. ($yunohost_result)\n" "white" clog
else
ECHO_FORMAT "Backup failed. ($yunohost_result)\n" "white" clog
fi
# Check all the witness files, to verify if them still here
check_witness_files
# Analyse the log to extract "warning" and "error" lines
LOG_EXTRACTOR
fi
# Check the result and print SUCCESS or FAIL
if [ $yunohost_result -eq 0 ]
then # Success
check_success
# The global success for a backup can't be a success if another backup failed
if [ $RESULT_check_backup -ne -1 ]; then
RESULT_check_backup=1 # Backup succeed
fi
else # Fail
check_failed
RESULT_check_backup=-1 # Backup failed
fi
# Grab the backup archive into the LXC container, and keep a copy
sudo cp -a /var/lib/lxc/$lxc_name/rootfs/home/yunohost.backup/archives ./
# RESTORE
# Try the restore process in 2 times, first after removing the app, second after a restore of the container.
local j=0
for j in 0 1
do
# First, simply remove the application
if [ $j -eq 0 ]
then
# Remove the application
REMOVE_APP
ECHO_FORMAT "\nRestore after removing the application...\n" "white" "bold" clog
# Second, restore the whole container to remove completely the application
elif [ $j -eq 1 ]
then
# Stop and restore the LXC container
LXC_STOP
# Place the copy of the backup archive in the container.
sudo mv -f ./archives /var/lib/lxc/$lxc_name/rootfs/home/yunohost.backup/
ECHO_FORMAT "\nRestore on a clean YunoHost system...\n" "white" "bold" clog
fi
# Restore the application from the previous backup
LXC_START "sudo yunohost --debug backup restore Backup_test --force --apps $ynh_app_id"
# yunohost_result gets the return code of the restore
yunohost_result=$?
# Print the result of the backup command
if [ $yunohost_result -eq 0 ]; then
ECHO_FORMAT "Restore successful. ($yunohost_result)\n" "white" clog
else
ECHO_FORMAT "Restore failed. ($yunohost_result)\n" "white" clog
fi
# Check all the witness files, to verify if them still here
check_witness_files
# Analyse the log to extract "warning" and "error" lines
LOG_EXTRACTOR
# Try to access the app by its url
CHECK_URL
# Check the result and print SUCCESS or FAIL
if check_test_result
then # Success
# The global success for a restore can't be a success if another restore failed
if [ $RESULT_check_restore -ne -1 ]; then
RESULT_check_restore=1 # Restore succeed
fi
else # Fail
RESULT_check_restore=-1 # Restore failed
fi
# Make a break if auto_remove is set
break_before_continue
# Stop and restore the LXC container
LXC_STOP
done
done
}
CHECK_CHANGE_URL () {
# Try the change_url script
unit_test_title "Change URL..."
# Check if the needed manifest key are set or abort the test
check_manifest_key "domain" || return
# Check if an install have previously work
local previous_install=$(is_install_failed)
# Abort if none install worked
[ "$previous_install" = "1" ] && return
# Copy original arguments
local manifest_args_mod="$manifest_arguments"
# Replace manifest key for the test
check_domain=$sub_domain
replace_manifest_key "domain" "$check_domain"
replace_manifest_key "user" "$test_user"
replace_manifest_key "public" "$public_public_arg"
# Try in 6 times !
# Without modify the domain, root to path, path to path and path to root.
# And then, same with a domain change
local i=0
for i in ` seq 1 6`
do
if [ $i -eq 1 ]; then
# Same domain, root to path
check_path=/
local new_path=$test_path
local new_domain=$sub_domain
elif [ $i -eq 2 ]; then
# Same domain, path to path
check_path=$test_path
local new_path=${test_path}_2
local new_domain=$sub_domain
elif [ $i -eq 3 ]; then
# Same domain, path to root
check_path=$test_path
local new_path=/
local new_domain=$sub_domain
elif [ $i -eq 4 ]; then
# Other domain, root to path
check_path=/
local new_path=$test_path
local new_domain=$main_domain
elif [ $i -eq 5 ]; then
# Other domain, path to path
check_path=$test_path
local new_path=${test_path}_2
local new_domain=$main_domain
elif [ $i -eq 6 ]; then
# Other domain, path to root
check_path=$test_path
local new_path=/
local new_domain=$main_domain
fi
replace_manifest_key "path" "$check_path"
# Check if root or subpath installation worked, or if force_install_ok is setted.
if [ $force_install_ok -eq 1 ]
then
# Try with a sub path install
if [ "$check_path" = "/" ]
then
if [ $RESULT_check_root -ne 1 ] && [ $force_install_ok -ne 1 ]
then
# Jump this test
ECHO_FORMAT "Root install failed, impossible to perform this test...\n" "lyellow" clog
continue
fi
# And with a sub path install
else
if [ $RESULT_check_sub_dir -ne 1 ] && [ $force_install_ok -ne 1 ]
then
# Jump this test
ECHO_FORMAT "Sub path install failed, impossible to perform this test...\n" "lyellow" clog
continue
fi
fi
fi
# Install the application in a LXC container
ECHO_FORMAT "\nPreliminary install...\n" "white" "bold" clog
STANDARD_SETUP_APP
# Wait for next release...
LXC_START "yunohost app --help | grep --quiet change-url"
if [ $? -ne 0 ]
then
ECHO_FORMAT "change-url is only available on testing or unstable...\n" "red" "bold"
RESULT_change_url=0
return 0
fi
# ...
# Check if the install had work
if [ $yunohost_result -ne 0 ]
then
ECHO_FORMAT "Installation failed...\n" "red" "bold"
else
ECHO_FORMAT "Change the url from $sub_domain$check_path to $new_domain$new_path...\n" "white" "bold" clog
# Change the url
LXC_START "sudo yunohost --debug app change-url $ynh_app_id -d \"$new_domain\" -p \"$new_path\""
# yunohost_result gets the return code of the change-url script
yunohost_result=$?
# Print the result of the change_url command
if [ $yunohost_result -eq 0 ]; then
ECHO_FORMAT "Change_url script successful. ($yunohost_result)\n" "white" clog
else
ECHO_FORMAT "Change_url script failed. ($yunohost_result)\n" "white" clog
fi
# Check all the witness files, to verify if them still here
check_witness_files
# Analyse the log to extract "warning" and "error" lines
LOG_EXTRACTOR
# Try to access the app by its url
check_path=$new_path
check_domain=$new_domain
CHECK_URL
fi
# Check the result and print SUCCESS or FAIL
if check_test_result
then # Success
# The global success for a change_url can't be a success if another change_url failed
if [ $RESULT_change_url -ne -1 ]; then
RESULT_change_url=1 # Change_url succeed
fi
else # Fail
RESULT_change_url=-1 # Change_url failed
fi
# Make a break if auto_remove is set
break_before_continue
# Stop and restore the LXC container
LXC_STOP
done
}
PACKAGE_LINTER () {
# Package linter
unit_test_title "Package linter..."
# Execute package linter and linter_result gets the return code of the package linter
"$script_dir/package_linter/package_linter.py" "$package_path" > "$temp_result"
# linter_result gets the return code of the package linter
local linter_result=$?
# Print the results of package linter and copy these result in the complete log
cat "$temp_result" | tee --append "$complete_log"
# Check the result and print SUCCESS or FAIL
if [ $linter_result -eq 0 ]
then # Success
check_success
RESULT_linter=1
else # Fail
check_failed
RESULT_linter=-1
fi
}
TEST_LAUNCHER () {
# Abstract for test execution.
# $1 = Name of the function to execute
# $2 = Argument for the function
# Intialize values
yunohost_result=-1
yunohost_remove=-1
# Execute the test
$1 $2
# Stop and restore the LXC container
LXC_STOP
}
set_witness_files () {
# Create files to check if the remove script does not remove them accidentally
echo "Create witness files..." | tee --append "$test_result"
lxc_dir="/var/lib/lxc/$lxc_name/rootfs"
create_witness_file () {
[ "$2" = "file" ] && local action="touch" || local action="mkdir -p"
sudo $action "${lxc_dir}${1}"
}
# Nginx conf
create_witness_file "/etc/nginx/conf.d/$main_domain.d/witnessfile.conf" file
create_witness_file "/etc/nginx/conf.d/$sub_domain.d/witnessfile.conf" file
# /etc
create_witness_file "/etc/witnessfile" file
# /opt directory
create_witness_file "/opt/witnessdir" directory
# /var/www directory
create_witness_file "/var/www/witnessdir" directory
# /home/yunohost.app/
create_witness_file "/home/yunohost.app/witnessdir" directory
# /var/log
create_witness_file "/var/log/witnessfile" file
# Config fpm
create_witness_file "/etc/php5/fpm/pool.d/witnessfile.conf" file
# Config logrotate
create_witness_file "/etc/logrotate.d/witnessfile" file
# Config systemd
create_witness_file "/etc/systemd/system/witnessfile.service" file
# Database
sudo lxc-attach --name=$lxc_name -- mysqladmin --user=root --password=$(sudo cat "$lxc_dir/etc/yunohost/mysql") --wait status > /dev/null 2>&1
sudo lxc-attach --name=$lxc_name -- mysql --user=root --password=$(sudo cat "$lxc_dir/etc/yunohost/mysql") --wait --execute="CREATE DATABASE witnessdb" > /dev/null 2>&1
}
check_witness_files () {
# Check all the witness files, to verify if them still here
lxc_dir="/var/lib/lxc/$lxc_name/rootfs"
check_file_exist () {
if sudo test ! -e "${lxc_dir}${1}"
then
ECHO_FORMAT "The file $1 is missing ! Something gone wrong !\n" "red" "bold"
RESULT_witness=1
fi
}
# Nginx conf
check_file_exist "/etc/nginx/conf.d/$main_domain.d/witnessfile.conf"
check_file_exist "/etc/nginx/conf.d/$sub_domain.d/witnessfile.conf"
# /etc
check_file_exist "/etc/witnessfile"
# /opt directory
check_file_exist "/opt/witnessdir"
# /var/www directory
check_file_exist "/var/www/witnessdir"
# /home/yunohost.app/
check_file_exist "/home/yunohost.app/witnessdir"
# /var/log
check_file_exist "/var/log/witnessfile"
# Config fpm
check_file_exist "/etc/php5/fpm/pool.d/witnessfile.conf"
# Config logrotate
check_file_exist "/etc/logrotate.d/witnessfile"
# Config systemd
check_file_exist "/etc/systemd/system/witnessfile.service"
# Database
if ! sudo lxc-attach --name=$lxc_name -- mysqlshow --user=root --password=$(sudo cat "$lxc_dir/etc/yunohost/mysql") | grep --quiet '^| witnessdb' > /dev/null 2>&1
then
ECHO_FORMAT "The database witnessdb is missing ! Something gone wrong !\n" "red" "bold"
RESULT_witness=1
fi
if [ $RESULT_witness -eq 1 ]
then
yunohost_result=1
yunohost_remove=1
fi
}
TESTING_PROCESS () {
# Launch all tests successively
ECHO_FORMAT "\nTests serie: ${tests_serie#;; }\n" "white" "underlined" clog
# Init the value for the current test
cur_test=1
# By default, all tests will try to access the app with curl
use_curl=1
# Check the package with package linter
if [ $pkg_linter -eq 1 ]; then
PACKAGE_LINTER
fi
# Try to install in a sub path
if [ $setup_sub_dir -eq 1 ]; then
TEST_LAUNCHER CHECK_SETUP subdir
fi
# Try to install on root
if [ $setup_root -eq 1 ]; then
TEST_LAUNCHER CHECK_SETUP root
fi
# Try to install without url access
if [ $setup_nourl -eq 1 ]; then
TEST_LAUNCHER CHECK_SETUP no_url
fi
# Try the upgrade script
if [ $upgrade -eq 1 ]; then
TEST_LAUNCHER CHECK_UPGRADE
fi
# Try to install in private mode
if [ $setup_private -eq 1 ]; then
TEST_LAUNCHER CHECK_PUBLIC_PRIVATE private
fi
# Try to install in public mode
if [ $setup_public -eq 1 ]; then
TEST_LAUNCHER CHECK_PUBLIC_PRIVATE public
fi
# Try multi-instance installations
if [ $multi_instance -eq 1 ]; then
TEST_LAUNCHER CHECK_MULTI_INSTANCE
fi
# Try to install with an malformed path
if [ $incorrect_path -eq 1 ]; then
TEST_LAUNCHER CHECK_COMMON_ERROR incorrect_path
fi
# Try to install with a port already used
if [ $port_already_use -eq 1 ]; then
TEST_LAUNCHER CHECK_COMMON_ERROR port_already_use
fi
# Try to backup then restore the app
if [ $backup_restore -eq 1 ]; then
TEST_LAUNCHER CHECK_BACKUP_RESTORE
fi
# Try the change_url script
if [ $change_url -eq 1 ]; then
TEST_LAUNCHER CHECK_CHANGE_URL
fi
}