#! /bin/bash -efu debug() { if [ -n "$DEBUG" ]; then echo "$*" >&2 fi } msg_usage() { cat <<_EOF_ Run family test. Usage: $PROG 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}" | 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." 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" echo "- {result: $result, test: $OPT_ALIAS}" >> "$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 "$i" done) cat <<_EOF_> $tmpconfd/fonts.conf /usr/share/fonts $conf $cachedir _EOF_ debug "Config: `cat $tmpconfd/fonts.conf`" mkdir -p "$OPT_ARTIFACTS_DIR" export OUTPUTFILE="$(realpath "$OPT_ARTIFACTS_DIR")/$STR_TEST_DASHED-out.log" logfile_stdout="$OPT_ARTIFACTS_DIR/$STR_TEST_DASHED.log" logfile_stderr="$OPT_ARTIFACTS_DIR/$STR_TEST_DASHED-err.log" exec 3>&1 4>&2 1> >(tee -a "$logfile_stdout" >&3) 2> >(tee -a "$logfile_stderr" >&4) debug "Check family assignment" res=`FONTCONFIG_FILE=$tmpconfd/fonts.conf fc-match -f "%{family[0]}" :family=$OPT_ALIAS:lang=$OPT_LANG` 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)" fi rm -rf $tmpconfd