re-import sources as agreed with the maintainer

This commit is contained in:
Adam Samalik 2023-07-10 12:48:18 +02:00
parent abfdcb9a61
commit 4414584d93
21 changed files with 1035 additions and 1 deletions

26
.gitignore vendored
View File

@ -1,2 +1,26 @@
SOURCES/cantarell-fonts-0.0.25.tar.xz
/cantarell-fonts-0.0.1.tar.bz2
/cantarell-fonts-0.0.3.tar.bz2
/cantarell-fonts-0.0.4.tar.bz2
/cantarell-fonts-0.0.5.tar.bz2
/cantarell-fonts-0.0.6.tar.bz2
/cantarell-fonts-0.0.7.tar.xz
/cantarell-fonts-0.0.8.tar.xz
/cantarell-fonts-0.0.9.tar.xz
/cantarell-fonts-0.0.10.tar.xz
/cantarell-fonts-0.0.10.1.tar.xz
/cantarell-fonts-0.0.11.tar.xz
/cantarell-fonts-0.0.12.tar.xz
/cantarell-fonts-0.0.13.tar.xz
/cantarell-fonts-0.0.14.tar.xz
/cantarell-fonts-0.0.15.tar.xz
/cantarell-fonts-0.0.16.tar.xz
/cantarell-fonts-0.0.17.tar.xz
/cantarell-fonts-0.0.17.1.tar.xz
/cantarell-fonts-0.0.17.2.tar.xz
/cantarell-fonts-0.0.18.tar.xz
/cantarell-fonts-0.0.20.1.tar.xz
/cantarell-fonts-0.0.21.tar.xz
/cantarell-fonts-0.0.22.tar.xz
/cantarell-fonts-0.0.23.tar.xz
/cantarell-fonts-0.0.24.tar.xz
/cantarell-fonts-0.0.25.tar.xz

2
tests/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/artifacts
*~

View File

@ -0,0 +1,69 @@
# Ansible role for tests using fontconfig
Put this role in your `tests.yml` playbook. The playbook will first install
package dependencies listed on playbook on your localhost, then it will proceed
to run testing. You can redefine the following variables:
* **artifacts**: An artifacts directory on localhost to store logs
* **remote_artifacts**: The directory on the system under test where the logs
are stored. Note: if this variable is left undefined, it will default to
`/tmp/artifacts`
* **required_packages**: A list of prerequisite packages required by tests.
Please note that for Atomic Host, additional packages will be installed
using the `rpm-ostree` command which is affecting the test subject (it's
similar as rebuilding an rpm package to be tested) so this should be used
with caution on only when necessary.
* **path_prefix**: The directory on the system where fonts are installed.
please use one in coverage sub-parameter if having different path_prefix
per sub-packages.
* **package**: The package name to test. this is used to find out fontconfig
config file. please use one in families sub-parameter if having different
config files per sub-packages.
* **coverage**: A list of languages for language coverage tests.
* **families**: A list of family test cases.
## Language coverage test parameters
Supporting two types of formats. one is a simple list of languages:
coverage:
- en
- fr
Another one is a dictionary that has a language as a key and values as parameters:
coverage:
en:
...
fr:
...
You can redefine the following variables for dictionary format:
* **exclude**: A list of font file names to exclude on this testing. this is
useful to avoid unexpected failures on iterating tests when a package has
multiple font files and has different coverages but you need to prevent
testing for few fonts which has different coverages to them.
Please note that the file name is relative to `path_prefix` parameter. also
good to consider using `include` if non-targeted files is more than targeted.
* **include**: A list of font file names to include on this testing. this is
useful to avoid unexpected failures on iterating tests when a pcakge has
multiple font files and has different coverages but you need to prevent
testing for few fonts which has different coverages to them.
Please note that the file name is relative to `path_prefix` parameter. also
good to consider using `exclude` if targeted files is more than non-targeted.
* **name**: The name to store logs. the test script is trying to make an unique
file names to store logs but not perfectly working in some cases. this is
optional parameter to make it unique by yourself.
* **path_prefix**: A list of directory names where fonts are installed on system.
this is optional parameter and tries to obtain the font paths from installed
packages by `required_packages` if not available.
## Family test parameters
* **lang**: A language to test family name for.
* **alias**: An alias name to test.
* **family**: A family name to test, which is supposed to be assinged to the alias.
* **package**: The package name to test. this is used to find out fontconfig
config file. this is optional. if not specified here, global `package`
parameter will be used.

View File

@ -0,0 +1,7 @@
---
role_pkgs_req:
- fontconfig
- fontconfig-devel
- pkg-config
- rsync

View File

@ -0,0 +1,162 @@
#! /bin/bash -efu
debug() {
if [ -n "$DEBUG" ]; then
echo "$*" >&2
fi
}
msg_usage() {
cat <<_EOF_
Run family test.
Usage:
$PROG <options>
Options:
-h, --help Display this help and exit
-v, --verbose Turn on debug
-l, --lang=LANG Test LANG language coverage (default: en)
-f, --family=FILE Set a family name supposed to be assigned for alias.
-g, --alias=STR Set an alias name. (default: sans-serif)
-a, --artifactsdir=DIR Set environment dir to store artifacts
-k, --package=NAME Set a package name for fonts.
_EOF_
}
PROG="${PROG:-${0##*/}}"
DEBUG="${DEBUG:-}"
OPT_LANG="${OPT_LANG:-en}"
OPT_FAMILY="${OPT_FAMILY:-}"
OPT_ARTIFACTS_DIR="${OPT_ARTIFACTS_DIR:-}"
OPT_ALIAS="${OPT_ALIAS:-sans-serif}"
OPT_PACKAGE="${OPT_PACKAGE:-}"
opt=$(getopt -n "$0" --options "hvl:f:t:a:g:k:" --longoptions "help,verbose,lang:,family:,test:,artifactsdir:,alias:,package:" -- "$@")
eval set -- "$opt"
while [[ $# -gt 0 ]]; do
case "$1" in
-k|--package)
OPT_PACKAGE="$2"
shift 2
;;
-g|--alias)
OPT_ALIAS="$2"
shift 2
;;
-a|--artifactsdir)
OPT_ARTIFACTS_DIR="$2"
shift 2
;;
-f|--family)
OPT_FAMILY="$2"
shift 2
;;
-l|--lang)
OPT_LANG="$2"
shift 2
;;
-v|--verbose)
DEBUG="-v"
shift
;;
-h|--help)
msg_usage
exit 0
;;
--)
shift
;;
*)
msg_usage
exit 1
esac
done
if [ -z "$OPT_ARTIFACTS_DIR" ] || [ -z "$OPT_LANG" ] || [ -z "$OPT_FAMILY" ]; then
echo "Use: $PROG -h for help."
exit 0
fi
debug "Alias: $OPT_ALIAS"
debug "Family: $OPT_FAMILY"
debug "Lang: $OPT_LANG"
debug "Artifacts dir: $OPT_ARTIFACTS_DIR"
debug "Package name: $OPT_PACKAGE"
STR_TEST_DASHED=$(echo "${OPT_PACKAGE}_${OPT_ALIAS}_${OPT_LANG}" | sed -e 's/\//-/g' -e 's/ /-/g')
debug "Log file: $STR_TEST_DASHED.log"
clean_exit() {
rc=$?;
trap - SIGINT SIGTERM SIGABRT EXIT
echo "Run test $OPT_ALIAS: done. Test's exit code: $rc"
for pid in $(ps -o pid --no-headers --ppid $$); do
if [ -n "$(ps -p $pid -o pid=)" ]; then
kill -s HUP $pid
fi
done
local log_file_name="$STR_TEST_DASHED.log"
local log_file_path="$OPT_ARTIFACTS_DIR/$log_file_name"
local status
if [[ $rc -eq 127 ]]; then
status="ERROR"
elif grep -q "RESULT: WARN" "$log_file_path"; then
status="ERROR"
elif grep -q "RESULT: FAIL" "$log_file_path"; then
status="FAIL"
elif grep -q "RESULT: PASS" "$log_file_path"; then
status="PASS"
elif grep -q "FAIL" "$log_file_path"; then
status="FAIL"
elif grep -q "PASS" "$log_file_path"; then
status="PASS"
else
status="ERROR"
fi
echo "$status $OPT_ALIAS" >> "$OPT_ARTIFACTS_DIR/test.log"
mv "$log_file_path" "$OPT_ARTIFACTS_DIR/${status}-${log_file_name}"
local results="$OPT_ARTIFACTS_DIR/results.yml"
local result=$(echo $status | tr '[:upper:]' '[:lower:]')
test -f "$results" || echo 'results:' > "$results"
printf '%s\n' '' \
"- test: $OPT_ALIAS" \
" result: $result" \
" logs:" \
" - ${status}_${log_file_name}" \
>> "$results"
exit 0
}
trap clean_exit SIGINT SIGTERM SIGABRT EXIT
cachedir=`pkg-config --variable cachedir fontconfig`
tmpconfd=`mktemp --tmpdir -d fontsci.XXXXXXXX`
conf=$(for i in `rpm -ql $OPT_PACKAGE | grep conf.d`; do
echo "<include>$i</include>"
done)
cat <<_EOF_> $tmpconfd/fonts.conf
<fontconfig>
<dir>/usr/share/fonts</dir>
$conf
<cachedir>$cachedir</cachedir>
</fontconfig>
_EOF_
debug "Config: `cat $tmpconfd/fonts.conf`"
mkdir -p "$OPT_ARTIFACTS_DIR"
export OUTPUTFILE="$(realpath "$OPT_ARTIFACTS_DIR")/$STR_TEST_DASHED-out.log"
logfile="$OPT_ARTIFACTS_DIR/$STR_TEST_DASHED.log"
logfile="$(realpath "$logfile")"
exec > >(tee -a "$logfile") 2>&1
debug "Check family assignment"
res=`FONTCONFIG_FILE=$tmpconfd/fonts.conf fc-match -f "%{family[0]}" :family=$OPT_ALIAS:lang=$OPT_LANG`
ret=0
if [ "x$res" = "x$OPT_FAMILY" ]; then
echo "RESULT: PASS: $OPT_FAMILY was assigned to $OPT_ALIAS as expected"
else
echo "RESULT: FAIL: $OPT_FAMILY wasn't assigned to $OPT_ALIAS (actual result: $res)"
ret=1
fi
rm -rf $tmpconfd
exit $ret

View File

@ -0,0 +1,252 @@
#! /bin/bash -efu
debug() {
if [ -n "$DEBUG" ]; then
echo "$*" >&2
fi
}
msg_usage() {
cat <<_EOF_
Run language coverage test.
Usage:
$PROG <options>
Options:
-h, --help Display this help and exit
-v, --verbose Turn on debug
-l, --lang=LANG Test LANG language coverage (default: en)
-p, --path=PATH Test fonts on PATH
-k, --package=PACKAGE Specify PACKAGE to obtain some information
-n, --name=NAME Set NAME to store a log file.
-a, --artifactsdir=DIR test environment dir to store artifacts
-e, --exclude=FILE Exclude FILE to check.
-i, --include=FILE Include File to check.
_EOF_
}
PROG="${PROG:-${0##*/}}"
DEBUG="${DEBUG:-}"
OPT_LANG="${OPT_LANG:-en}"
OPT_PATH=()
OPT_PACKAGE=()
OPT_ARTIFACTS_DIR="${OPT_ARTIFACTS_DIR:-}"
OPT_EXCLUDE=()
OPT_INCLUDE=()
OPT_NAME="${OPT_NAME:-}"
opt=$(getopt -n "$0" --options "hvl:p:k:n:a:e:i:" --longoptions "help,verbose,lang:,path:,package:,name:,artifactsdir:,exclude:,include:" -- "$@")
eval set -- "$opt"
while [[ $# -gt 0 ]]; do
case "$1" in
-n|--name)
OPT_NAME="$2"
shift 2
;;
-i|--include)
OPT_INCLUDE+=("$2")
shift 2
;;
-e|--exclude)
OPT_EXCLUDE+=("$2")
shift 2
;;
-a|--artifactsdir)
OPT_ARTIFACTS_DIR="$2"
shift 2
;;
-p|--path)
OPT_PATH+=("$2")
shift 2
;;
-k|--package)
OPT_PACKAGE+=("$2")
shift 2
;;
-l|--lang)
OPT_LANG="$2"
shift 2
;;
-v|--verbose)
DEBUG="-v"
shift
;;
-h|--help)
msg_usage
exit 0
;;
--)
shift
;;
*)
msg_usage
exit 1
esac
done
if [ -z "$OPT_ARTIFACTS_DIR" ] || [ -z "$OPT_LANG" ] || [ ! -v OPT_PATH ] && [ ! -v OPT_PACKAGE ]; then
echo "Use: $PROG -h for help."
exit 0
fi
STR_TEST_DASHED=$(echo "${OPT_NAME:-$OPT_LANG}" | sed -e 's/\//-/g')
clean_exit() {
rc=$?;
trap - SIGINT SIGTERM SIGABRT EXIT
echo "Run test $OPT_LANG: done. Test's exit code: $rc"
for pid in $(ps -o pid --no-headers --ppid $$); do
if [ -n "$(ps -p $pid -o pid=)" ]; then
kill -s HUP $pid
fi
done
local log_file_name="$STR_TEST_DASHED.log"
local log_file_path="$OPT_ARTIFACTS_DIR/$log_file_name"
local status
if [[ $rc -eq 127 ]]; then
status="ERROR"
elif grep -q "RESULT: WARN" "$log_file_path"; then
status="ERROR"
elif grep -q "RESULT: FAIL" "$log_file_path"; then
status="FAIL"
elif grep -q "RESULT: PASS" "$log_file_path"; then
status="PASS"
elif grep -q "WARN" "$log_file_path"; then
status="ERROR"
elif grep -q "FAIL" "$log_file_path"; then
status="FAIL"
elif grep -q "PASS" "$log_file_path"; then
status="PASS"
else
status="ERROR"
fi
echo "$status $OPT_LANG" >> "$OPT_ARTIFACTS_DIR/test.log"
mv "$log_file_path" "$OPT_ARTIFACTS_DIR/${status}-${log_file_name}"
local results="$OPT_ARTIFACTS_DIR/results.yml"
local result=$(echo $status | tr '[:upper:]' '[:lower:]')
test -f "$results" || echo 'results:' > "$results"
printf '%s\n' '' \
"- test: $OPT_LANG" \
" result: $result" \
" logs:" \
" - ${status}_${log_file_name}" \
>> "$results"
exit 0
}
trap clean_exit SIGINT SIGTERM SIGABRT EXIT
mkdir -p "$OPT_ARTIFACTS_DIR"
export OUTPUTFILE="$(realpath "$OPT_ARTIFACTS_DIR")/$STR_TEST_DASHED-out.log"
logfile="$OPT_ARTIFACTS_DIR/$STR_TEST_DASHED.log"
logfile="$(realpath "$logfile")"
exec > >(tee -a "$logfile") 2>&1
for pkg in ${OPT_PACKAGE[@]}; do
if ! rpm -q ${pkg} > /dev/null 2>&1; then
echo "Package isn't installed or maybe a typo: ${pkg}"
exit 127
fi
d=$(for d in $(rpm -ql ${pkg}|grep /usr/share/fonts); do
dirname $d
done | sort | uniq | grep /usr/share/fonts/)
if [[ ! " ${OPT_PATH[@]} " =~ " ${d} " ]]; then
OPT_PATH+=("$d")
fi
done
expand_regex() {
local p ret=()
local regex="$1"
shift
debug "Expanding $regex"
for p; do
set +f
debug "$p: $regex"
(cd $p;
local x=$(find -regextype posix-egrep -regex "./$regex" -print|sed -e 's,^\./,,g')
debug "$x"
ret+=($x)
set -f
echo -n ${ret[@]}
)
done
echo -n ${ret[@]}
}
iv=()
ev=()
x=()
for p in ${OPT_INCLUDE[@]}; do
x=$(expand_regex $p ${OPT_PATH[@]})
if [ "x$x" == "x" ]; then
echo "RESULT: WARN: No matches on \"$p\". maybe typo or something changed?"
continue
fi
iv=("${iv[@]}" "${x[@]}")
done
for p in ${OPT_EXCLUDE[@]}; do
x=$(expand_regex $p ${OPT_PATH[@]})
if [ "x$x" == "x" ]; then
echo "RESULT: WARN: No matches on \"$p\". maybe typo or something changed?"
continue
fi
ev=("${ev[@]}" "${x[@]}")
done
OPT_EXCLUDE=(${ev[@]})
OPT_INCLUDE=(${iv[@]})
debug "Path: ${OPT_PATH[@]}"
debug "Lang: $OPT_LANG"
debug "Artifacts dir: $OPT_ARTIFACTS_DIR"
debug "Exclude: ${#OPT_EXCLUDE[@]}: ${OPT_EXCLUDE[@]}"
debug "Include: ${#OPT_INCLUDE[@]}: ${OPT_INCLUDE[@]}"
contains() {
local e match="$1"
shift
for e; do [[ "$e" == "$match" ]] && return 1; done
return 0
}
debug "Check language coverage"
ret=0
set +f
for p in ${OPT_PATH[@]}; do
for i in `find $p -regex '.*/*\.\(t1\)?\(ttf\)?\(otf\)?\(ttc\)?\(pcf.*\)?\(pfa\)?'`; do
set -f
debug "$i"
if test -f $i; then
n=`basename $i`
set +e
contains "$n" "${OPT_EXCLUDE[@]}"
r=$?
set -e
if [ $r -eq 1 ]; then
debug "ignoring $i"
continue
fi
if [ ${#OPT_INCLUDE[@]} -ne 0 ]; then
set +e
contains "$n" "${OPT_INCLUDE[@]}"
r=$?
set -e
if [ $r -eq 0 ]; then
debug "$i isn't targeted file"
continue
fi
NOT_MATCHED=("${NOT_MATCHED[@]/$n}")
fi
debug " $i"
res=`fc-validate -l $OPT_LANG $i || :`
if echo $res | grep -q Missing; then
echo "RESULT: FAIL: $i doesn't satisfy $OPT_LANG language coverage."
ret=1
else
echo "RESULT: PASS: $i satisfy $OPT_LANG language coverage."
fi
fi
done
done
exit $ret

View File

@ -0,0 +1,4 @@
---
dependencies:
- role: str-common-init

View File

@ -0,0 +1,48 @@
---
- block:
- name: language coverage
environment:
LANG: "en_US.UTF-8"
script: run-lang-coverage-test --lang "{{ item }}" {% if path_prefix is defined %} --path {{ path_prefix }} {% elif coverage.values is not defined or coverage[item].path_prefix is not defined %} {% else %} {{ '--path "' + (coverage[item].path_prefix | join('" --path "')) + '"' }} {% endif %} --artifactsdir "{{ remote_artifacts }}" {% if coverage.values is not defined or coverage[item].name is not defined %} {% else %} {{ "--name " + coverage[item].name }} {% endif %} {% if coverage.values is not defined or coverage[item].exclude is not defined %} {% else %} {{ '--exclude "' + (coverage[item].exclude | join('" --exclude "')) + '"' }} {% endif %} {% if coverage.values is not defined or coverage[item].include is not defined %} {% else %} {{ '--include "' + (coverage[item].include | join('" --include "')) + '"' }} {% endif %} {% if path_prefix is defined or coverage.values is defined and coverage[item].path_prefix is defined %} {% else %} {{ '--package "' + (required_packages|join('" --package "')) + '"' }} {% endif %}
with_items:
- "{{ coverage if coverage.keys is not defined else coverage.keys()|list }}"
- name: generic family assignment
environment:
LANG: "en_US.UTF-8"
when: families is defined
script: run-family-test --lang {{ item.lang }} --family '{{ item.family }}' --alias {{ item.alias }} --artifactsdir {{ remote_artifacts }} --package {{ package if item.package is not defined else item.package }}
with_items:
- "{{ families }}"
- name: Check the results
shell: |
log="{{ remote_artifacts }}/test.log"
if [ ! -f "$log" ]; then
echo ERROR
echo "Test results not found." 1>&2
elif grep ^ERROR "$log" 1>&2; then
echo ERROR
elif grep ^FAIL "$log" 1>&2; then
echo FAIL
elif grep -q ^PASS "$log"; then
echo PASS
else
echo ERROR
echo "No test results found." 1>&2
fi
register: test_results
- name: Set role result
set_fact:
role_result: "{{ test_results.stdout }}"
role_message: "{{ test_results.stderr|d('test execution error.') }}"
role_result_failed: "{{ test_results.stdout != 'PASS' }}"
role_result_msg: "{{ test_results.stderr|d('test execution error.') }}"
- include_role:
name: str-common-final
- name: Validate the result
shell: echo "test_results.stdout"
failed_when: test_results.stdout != 'PASS'

View File

@ -0,0 +1,7 @@
---
role_pkgs_req:
- fontconfig
- fontconfig-devel
- pkg-config
- rsync

View File

@ -0,0 +1,17 @@
---
- name: Pull out the logs from test environment to test runner
synchronize:
dest: "{{ artifacts }}/"
src: "{{ remote_artifacts }}/"
mode: pull
ssh_args: "-o UserKnownHostsFile=/dev/null"
when: artifacts|default("") != ""
- name: Report role result
vars:
msg: |
Result: {{ role_result|d('Undefined') }}
{{ role_message|d('None') }}
debug:
msg: "{{ msg.split('\n') }}"

View File

@ -0,0 +1,12 @@
---
tests: []
required_packages: []
tenv_workdir: /var/str/
remote_artifacts: /tmp/artifacts/
test_runner_inventory_name: test-runner
artifacts: "{{ lookup('env', 'TEST_ARTIFACTS')|default('./artifacts', true) }}"
# distro_name: rhel, centos, fedora
distro_name: "{{ansible_distribution|lower}}"
# distro_name_ver: rhel_7, centos_7, fedora_22
distro_name_ver: "{{ansible_distribution|lower}}_{{ansible_distribution_major_version}}"

View File

@ -0,0 +1,33 @@
- block:
- name: Check if system is Atomic Host
lineinfile:
name: /etc/os-release
regexp: .*Atomic Host.*
state: absent
check_mode: yes
changed_when: False
register: os_release_atomic
- name: Set fact 'is_atomic'
delegate_facts: True
set_fact:
is_atomic: "{{ os_release_atomic.found > 0 }}"
- name: Set facts about system
delegate_facts: True
set_fact:
is_yum_os: >-
{{ ansible_pkg_mgr == 'yum' }}
is_dnf_os: >-
{{ ansible_pkg_mgr == 'dnf' }}
is_rhel8_based: >-
{{
( [ansible_distribution] |
intersect(['RedHat', 'CentOS']) | length | bool ) and
ansible_distribution_version|int == 8
}}
# Make sure to use python3 when running on RHEL8 and Fedora distributions.
- name: Hardcode Python 3 interpreter for ansible modules
set_fact:
ansible_python_interpreter: /usr/bin/env python3
when: is_rhel8_based or distro_name == 'fedora'

View File

@ -0,0 +1,40 @@
- import_tasks: inspect.yml
- debug:
msg: "System uses yum: {{ is_yum_os }}"
verbosity: 1
- debug:
msg: "System uses dnf: {{ is_dnf_os }}"
verbosity: 1
- debug:
msg: "System is Atomic Host: {{ is_atomic }}"
verbosity: 1
- import_tasks: trunner.yml
- name: Install packages requested in `required_packages` section from tests.yml
include_role:
name: str-common-pkgs
vars:
param_req_pkgs:
- "{{ required_packages|d|list }}"
- "{{ role_pkgs_req|d|list }}"
- name: Make artifacts directory
file: path={{ remote_artifacts }} state=directory owner=root mode=755 recurse=yes
# Next task requires rsync on test environment
- name: Copy tests to test environment
synchronize:
src: "{{ playbook_dir }}/"
dest: "{{ tenv_workdir }}"
ssh_args: "-o UserKnownHostsFile=/dev/null"
- name: Start services defined in `required_services`
service:
name: "{{ item }}"
state: started
with_flattened:
- "{{ required_services|d|list }}"

View File

@ -0,0 +1,126 @@
- name: Add test-runner to ansible inventory
add_host:
name: "{{ test_runner_inventory_name }}"
ansible_connection: local
- delegate_to: "{{ test_runner_inventory_name }}"
block:
- name: Set ansible_python_interpreter to /usr/bin/python3
delegate_facts: True
set_fact:
ansible_python_interpreter: /usr/bin/python3
# lookup() - runs always on test-runner
when:
(
(lookup('file', '/etc/os-release') | regex_search("^ID=\"*rhel", multiline=True))
and
(lookup('file', '/etc/os-release') | regex_search("^VERSION_ID=\"*8", multiline=True))
) or (
(lookup('file', '/etc/os-release') | regex_search("^ID=\"*fedora", multiline=True))
and
(lookup('file', '/etc/os-release') | regex_search("^VERSION_ID=\"*[^2][0-9]", multiline=True))
)
- name: Gather facts from test-runner
setup:
# Just minimum subset should be enough for what we need
# hardware subset is taking about 30mins to run on CentOS openshift
gather_subset:
- '!all'
delegate_facts: True
- name: Set facts about test-runner
delegate_facts: True
set_fact:
is_yum_os: >-
{{ hostvars[test_runner_inventory_name]['ansible_pkg_mgr'] == 'yum' }}
is_dnf_os: >-
{{ hostvars[test_runner_inventory_name]['ansible_pkg_mgr'] == 'dnf' }}
is_rhel8_based: >-
{{
( [hostvars[test_runner_inventory_name]['ansible_distribution']] |
intersect(['RedHat', 'CentOS']) | bool )
and
( hostvars[test_runner_inventory_name]['ansible_distribution_version'] |
int == 8 )
}}
# Fix python ansible interpreter when running on RHEL8. Currently RHEL8
# uses python2, but it does miss some python2 modules, such as python2-dnf.
# This can be removed once RHEL8 uses by default Python 3.
- name: Hardcode Python 3 interpreter for ansible modules for test-runner
delegate_facts: True
set_fact:
ansible_python_interpreter: /usr/bin/env python3
when: "hostvars[test_runner_inventory_name]['is_rhel8_based'] | bool"
- name: Fetch tests from remote repositories
git:
repo: "{{ item.repo }}"
dest: "{{ item.dest }}"
version: "{{ item.version | default('master') }}"
with_items:
"{{ repositories }}"
when: repositories is defined
# Prepare the filter command (check 'filter' variable for tests
# stored directly in the repo and also 'filter' key for each
# fetched test repo dictionary in the 'repositories' list).
- set_fact:
filter_command: "str-filter-tests"
- set_fact:
filter_command: "{{ filter_command }} . '{{ fmf_filter }}'"
when: fmf_filter is defined
- set_fact:
filter_command: "{{ filter_command }} '{{ item.dest }}' '{{ item.fmf_filter }}'"
with_items:
- "{{ repositories }}"
when: repositories is defined and item.fmf_filter is defined
- debug:
var: filter_command
verbosity: 1
# Filter tests based on the gathered parameters. (The filter
# command is extended for each provided filter. That's why
# there's check for filter_command != "str-filter-tests" which
# ensures that there has been at least one filter defined.)
- set_fact:
filter_tests: []
- name: Filter tests according to provided fmf filters
shell: "{{ filter_command }}"
register: filter_output
when: filter_command != "str-filter-tests"
- debug:
var: filter_output
verbosity: 2
- set_fact:
filter_tests: "{{ filter_output.stdout_lines }}"
when: filter_output.stdout_lines is defined
- debug:
var: filter_tests
verbosity: 1
- debug:
msg: >
{{ test_runner_inventory_name }} is:
{{ hostvars[test_runner_inventory_name]['ansible_distribution'] }}
verbosity: 1
- debug:
msg: >
{{ test_runner_inventory_name }} uses yum:
{{ hostvars[test_runner_inventory_name]['is_yum_os'] }}
verbosity: 1
- debug:
msg: >
{{ test_runner_inventory_name }} uses dnf:
{{ hostvars[test_runner_inventory_name]['is_dnf_os'] }}
verbosity: 1
- debug:
msg: >
{{ test_runner_inventory_name }} is RHEL8 based OS:
{{ hostvars[test_runner_inventory_name]['is_rhel8_based'] }}
verbosity: 1

View File

@ -0,0 +1,12 @@
---
tests: []
required_packages: []
tenv_workdir: /var/str/
remote_artifacts: /tmp/artifacts/
test_runner_inventory_name: test-runner
artifacts: "{{ lookup('env', 'TEST_ARTIFACTS')|default('./artifacts', true) }}"
# distro_name: rhel, centos, fedora
distro_name: "{{ansible_distribution|lower}}"
# distro_name_ver: rhel_7, centos_7, fedora_22
distro_name_ver: "{{ansible_distribution|lower}}_{{ansible_distribution_major_version}}"

View File

@ -0,0 +1,35 @@
- block:
- name: Check if system is Atomic Host
lineinfile:
name: /etc/os-release
regexp: .*Atomic Host.*
state: absent
check_mode: yes
changed_when: False
register: os_release_atomic
- name: Set fact 'is_atomic'
delegate_facts: True
set_fact:
is_atomic: "{{ os_release_atomic.found > 0 }}"
- name: Set facts about system
delegate_facts: True
set_fact:
is_yum_os: >-
{{ ansible_pkg_mgr == 'yum' }}
is_dnf_os: >-
{{ ansible_pkg_mgr == 'dnf' }}
is_rhel8_based: >-
{{
( [ansible_distribution] |
intersect(['RedHat', 'CentOS']) | length | bool ) and
ansible_distribution_version|int == 8
}}
# Fix python ansible interpreter when running on RHEL8. Currently RHEL8
# uses python2, but it does miss some python2 modules, such as python2-dnf.
# This can be removed once RHEL8 uses by default Python3
- name: Hardcode Python 3 interpreter for ansible modules
set_fact:
ansible_python_interpreter: /usr/bin/env python3
when: is_rhel8_based

View File

@ -0,0 +1,36 @@
- name: Build packages lists to be present on test environment
# Separate debuginfo and ordinary packages. There is an issue on GitHub:
# https://github.com/ansible/ansible/issues/31579. The easiest way to install
# debuginfo for package is to use 'debuginfo-install'. This program is
# present on RHEL/CentOS/Fedora and it automatically enables debuginfo repos.
set_fact:
pkgs_ordinary_req: >
{{
pkgs_ordinary_req|d|list|union([item]) |
reject('match', '.*-debuginfo$') |
list
}}
pkgs_debuginfo_req: >
{{
[[item] | select('match', '.*-debuginfo$') | list | join | regex_replace('-debuginfo')] |
difference([""]) |
union(pkgs_debuginfo_req|d|list)
}}
with_flattened:
- "{{ param_req_pkgs }}"
- name: Set package manager variable
set_fact:
pkg_mgr: >
{{
'rpm-ostree' if (is_atomic and
(ansible_pkg_mgr == 'unknown' or
ansible_pkg_mgr == 'atomic_container'))
else ansible_pkg_mgr
}}
- debug:
msg: "Package manager: {{ pkg_mgr }}"
verbosity: 1
- include_tasks: "pkgs-{{ pkg_mgr | trim}}.yml"

View File

@ -0,0 +1,46 @@
- name: Remove yum-utils for dnf system
package: name=yum-utils state=absent
register: result
retries: 5
delay: 10
until: result is succeeded
- name: Install additional dnf packages
package: name={{ item }} state=present
register: result
with_items:
- dnf-plugins-core
- dnf-utils
retries: 5
delay: 10
until: result is succeeded
- name: Enable copr repos
shell: dnf copr enable -y {{ item }}
with_flattened:
# Copr repos required by tests
- "{{ copr_repos_req|d|list }}"
# Copr repos required by roles
- "{{ role_copr_repos_req|d|list }}"
ignore_errors: True
when: distro_name == "fedora"
- name: Install test-specific package requirements
# Note, this method cannot install -debuginfo packages.
package: name={{ item }} state=present
register: result
with_flattened:
- "{{ pkgs_ordinary_req|d|list }}"
retries: 5
delay: 10
until: result is succeeded
- name: Install debuginfo packages
shell: |
debuginfo-install --assumeyes {{item}}
register: result
with_items:
- "{{ pkgs_debuginfo_req|d|list }}"
retries: 5
delay: 10
until: result is succeeded

View File

@ -0,0 +1,49 @@
- name: Enable copr repos on Atomic Host
# It is possible to add .repo file to /etc/yum.repos.d/ and install required
# packages.
shell: |
# This code was traslitirated from dnf-plugins/copr.py
# item == mvadkert/beakerlib-libraries
PROJECT="{{ item }}"
REPO_FILE="${PROJECT//\//-}"
REPO_FILE="/etc/yum.repos.d/_copr_${REPO_FILE}.repo"
if [ -e "$REPO_FILE" ]; then
echo "Warning: $REPO_FILE already exists. Exit."
exit
fi
VERSION_ID="$(source /etc/os-release; echo $VERSION_ID)" # 7, 27, Rawhide has: next release
REDHAT_SUPPORT_PRODUCT_VERSION="$(source /etc/os-release; echo $REDHAT_SUPPORT_PRODUCT_VERSION)" # rawhide, 7, 26
ID="$(source /etc/os-release; echo $ID)" # centos, fedora
CHROOT="epel-$VERSION_ID"
if [ "$ID" = "fedora" ]; then
CHROOT="fedora-$REDHAT_SUPPORT_PRODUCT_VERSION"
fi
URL="http://copr.fedoraproject.org/coprs/$PROJECT/repo/$CHROOT/"
echo "$URL"
curl "$URL" -L --retry 5 --output "$REPO_FILE"
with_flattened:
# Copr repos required by tests
- "{{ copr_repos_req|d|list }}"
# Copr repos required by roles
- "{{ role_copr_repos_req|d|list }}"
ignore_errors: True
- block:
- name: Make a list of requested packages for Atomic Host
set_fact:
pkgs_atomic_req: "{{ pkgs_ordinary_req|d|join(' ') }} "
- debug:
msg: "Requested packages for Atomic Host: {{ pkgs_atomic_req }}"
verbosity: 1
- name: Check presence of test-specific package requirements
shell: rpm -q {{ pkgs_atomic_req }}
register: package_check
changed_when: False
failed_when: False
args: {warn: no}
- name: Install test-specific package requirements
shell:
rpm-ostree install {{ pkgs_atomic_req }}
&& rpm-ostree ex livefs
when: package_check.rc != 0
when: pkgs_ordinary_req|d(false)

View File

@ -0,0 +1,38 @@
- name: Install additional yum packages
package: name={{ item }} state=present
register: result
with_items:
- yum-plugin-copr
- yum-utils
retries: 5
delay: 10
until: result is succeeded
- name: Enable copr repos
shell: yum copr enable -y {{ item }}
with_flattened:
# Copr repos required by tests
- "{{ copr_repos_req|d|list }}"
# Copr repos required by roles
- "{{ role_copr_repos_req|d|list }}"
ignore_errors: True
- name: Install test-specific package requirements
# Note, this method cannot install -debuginfo packages.
package: name={{ item }} state=present
register: result
with_flattened:
- "{{ pkgs_ordinary_req|d|list }}"
retries: 5
delay: 10
until: result is succeeded
- name: Install debuginfo packages
shell: |
debuginfo-install --assumeyes {{item}}
register: result
with_items:
- "{{ pkgs_debuginfo_req|d|list }}"
retries: 5
delay: 10
until: result is succeeded

15
tests/tests.yml Normal file
View File

@ -0,0 +1,15 @@
- hosts: localhost
tags:
- classic
become: yes
roles:
- role: custom-test-fonts
required_packages:
- abattis-cantarell-fonts
package: abattis-cantarell-fonts
coverage:
- en
families:
- lang: en
alias: system-ui
family: Cantarell