Files
swupd-client/test/real_content/real_content_lib.bash
Otavio Pontes 2bf4169a4a Don't mix tabs with spaces in the same file
And prefer tabs over spaces, because that's the project standard for
source files

Signed-off-by: Otavio Pontes <otavio.pontes@intel.com>
2019-10-29 11:54:25 -07:00

163 lines
5.1 KiB
Bash

#!/bin/bash
#TODO: Add test for crossing a format barrier
# shellcheck disable=SC1090
# SC1090: Can't follow non-constant source. Use a directive to specify location.
# We already process that file, so it's fine to ignore
SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_PATH/../functional/testlib.bash"
# Test swupd with real official content published on clearlinux.org
# This test assumes all functional tests to be passing in order to work,
# because we aren't going to test all swupd functionalities. The idea is
# to test major swupd commands and standard use cases
# Optional parameters
# $URL: Clearlinux content and version urls
# $MAX_VERSIONS: The maximum number of versions we are going to be looking to
# test updates. Should be # at least 2 (current + update).
# Default is 10.
# $BUNDLE_LIST: List of bundles to be installed on the system besides os-core
# and os-core-update. If empty, install all bundles.
# $BASE_DIR: A base dir different from current directory
export SWUPD_OPTS # Swupd options to use in tests
export SWUPD_OPTS_SHORT # Swupd options to use in tests (for bundle-list)
export FORMAT # Format of the last available version
export VERSION # Array of last available versions. First item is the oldest
export ROOT_DIR # Root directory of the installation
# get_format: Echos the format of the version in $1
get_format() {
v="$1"
curl -f "${URL}/${v}/format" 2>/dev/null
return 0
}
# get_current_format(): Get last available format released
get_current_format() {
last_version=$(curl -f "${URL}/version/latest_version" 2>/dev/null)
get_format "$last_version"
return 0
}
install_bundles() {
local CMD=os-install
# TODO: Replace verify --fix with repair as soon as the feature is implemented
[ "$1" = "-r" ] && { CMD="verify --fix"; shift ; }
if [ -z "$BUNDLE_LIST" ]; then
run sudo sh -c "$SWUPD bundle-list --all $SWUPD_OPTS_SHORT"
# shellcheck disable=SC2154
# SC2154: output is referenced but not assigned.
# the output variable is being assigned and exported by bats
BUNDLE_LIST=$(echo "$output" | tr '\n' ' ')
num_pkgs=$(echo "$output" | wc -l)
cur_version=$(grep VERSION_ID "${ROOT_DIR}/usr/lib/os-release" | cut -d = -f 2)
num_pkgs_mom=$(sh -c "curl ${URL}/$cur_version/Manifest.MoM 2>/dev/null | grep ^M\\\\. | wc -l")
if [ "$num_pkgs" -ne "$num_pkgs_mom" ]; then
print "Number of packages on bundle-list --all is $num_pkgs. Expected is $num_pkgs_mom:"
print "$BUNDLE_LIST"
return 1
fi
fi
print "Install bundles: $BUNDLE_LIST"
# shellcheck disable=SC2086
# Disabling because I want to split spaces here
CUR_VER=$("$SWUPD" info $SWUPD_OPTS | grep "Installed version"|cut -d ':' -f 2)
BUNDLE_LIST="${BUNDLE_LIST// /,}"
run sudo sh -c "$SWUPD $CMD $SWUPD_OPTS -B $BUNDLE_LIST -V $CUR_VER"
print "Instalation completed"
assert_status_is 0
verify_system
}
# check_version: Check if version in /usr/lib/os-release is equal $1.
# Fails otherwise.
check_version() {
version="$1"
cur_version=$(grep VERSION_ID "${ROOT_DIR}/usr/lib/os-release" | cut -d = -f 2)
if [ "$version" -ne "$cur_version" ]; then
print "Version $version is different from expected $cur_version"
return 1
fi
}
verify_system() {
run sudo sh -c "$SWUPD diagnose --picky $SWUPD_OPTS 2>/dev/null"
assert_status_is 0
return
}
test_setup() {
# Fill defaults in optional parameters
if [ -z "$URL" ]; then
URL=https://cdn.download.clearlinux.org/update
fi
if [ -z "$MAX_VERSIONS" ]; then
MAX_VERSIONS=10
fi
if [ -z "$BASE_DIR" ]; then
BASE_DIR=$PWD
fi
# Using github clr-bundles project to get official clear releases
# version list is sorted from newer to older
# TODO: Discover available versions to work with custom mixers
read -r -d '\n' -a version_list < <(git ls-remote --tags https://github.com/clearlinux/clr-bundles.git | grep -v {} | grep -v latest | sed "s/.*refs\\/tags\\///" | sort -gr | head -n "$MAX_VERSIONS" | sort -g) || echo
if [ "${#version_list[@]}" -eq 0 ]; then
print "Impossible to get versions list"
return 1
fi
# Get the last format
FORMAT=$(get_current_format)
export FORMAT
# Fill a list of last available versions (up to ${MAX_VERSIONS})
i=0
for v in "${version_list[@]}"; do
format=$(get_format "$v")
# if version isn't published or is from a different version, discard
if [ -z "$format" ] || [ "$FORMAT" -ne "$format" ]; then
continue
fi
VERSION[$i]=$v
i=$((i+1))
done
# Not enough versions to run the test
if [ -z "${VERSION[0]}" ] || [ -z "${VERSION[1]}" ]; then
# TODO: This is going to break on first release in a new format
print "We need at least 2 versions in format $FORMAT to continue with this test"
return 1
fi
ROOT_DIR="${BASE_DIR}/${TEST_NAME}"
sudo rm -rf "$ROOT_DIR"
sudo mkdir -p "$ROOT_DIR"
SWUPD_OPTS_SHORT="-u ${URL} -p ${ROOT_DIR} -S ${ROOT_DIR}/var/lib/swupd/ --no-progress"
SWUPD_OPTS="$SWUPD_OPTS_SHORT --no-scripts -t"
}
test_teardown() {
if [ "$DEBUG_TEST" = true ]; then
local msg="warning: debug_test is set to true, the test environment will be preserved"
print "$msg\\n" 2>/dev/null || echo "$msg"
return
fi
ROOT_DIR="${BASE_DIR}/${TEST_NAME}"
sudo rm -rf "$ROOT_DIR"
}