From 8b594bc5b714b132fb57f50d32f5d512341cff42 Mon Sep 17 00:00:00 2001
From: Adam Samalik <asamalik@redhat.com>
Date: Mon, 10 Jul 2023 08:45:38 +0200
Subject: [PATCH] re-import sources as agreed with the maintainer

---
 .gitignore                                    |   2 +-
 gating.yaml                                   |   6 +
 kurdit-unikurd-web-fonts.spec                 |   5 +-
 .../roles/custom-test-fonts/defaults/main.yml |   7 +
 .../custom-test-fonts/files/run-family-test   | 153 ++++++++++++
 .../files/run-lang-coverage-test              | 224 ++++++++++++++++++
 tests/roles/custom-test-fonts/meta/main.yml   |   4 +
 tests/roles/custom-test-fonts/tasks/main.yml  |  40 ++++
 tests/tests.yml                               |  15 ++
 9 files changed, 454 insertions(+), 2 deletions(-)
 create mode 100644 gating.yaml
 create mode 100644 tests/roles/custom-test-fonts/defaults/main.yml
 create mode 100755 tests/roles/custom-test-fonts/files/run-family-test
 create mode 100755 tests/roles/custom-test-fonts/files/run-lang-coverage-test
 create mode 100644 tests/roles/custom-test-fonts/meta/main.yml
 create mode 100644 tests/roles/custom-test-fonts/tasks/main.yml
 create mode 100644 tests/tests.yml

diff --git a/.gitignore b/.gitignore
index 6b0ca07..374db8f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
-SOURCES/unikurdweb_0.zip
+unikurdweb.zip
 /unikurdweb_0.zip
diff --git a/gating.yaml b/gating.yaml
new file mode 100644
index 0000000..6985029
--- /dev/null
+++ b/gating.yaml
@@ -0,0 +1,6 @@
+--- !Policy
+product_versions:
+  - rhel-8
+decision_context: osci_compose_gate
+rules:
+  - !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}
diff --git a/kurdit-unikurd-web-fonts.spec b/kurdit-unikurd-web-fonts.spec
index 4f83bfa..a1b53aa 100644
--- a/kurdit-unikurd-web-fonts.spec
+++ b/kurdit-unikurd-web-fonts.spec
@@ -4,7 +4,7 @@
 
 Name:          %{fontname}-fonts
 Version:       20020502
-Release:       19%{?dist}
+Release:       20%{?dist}
 Summary:       A widely used Kurdish font for Arabic-like scripts and Latin
 
 License:       GPLv3
@@ -50,6 +50,9 @@ install -Dm 0644 -p %{SOURCE2} \
 %{_datadir}/appdata/%{fontname}.metainfo.xml
 
 %changelog
+* Mon Nov 18 2019 Parag Nemade <pnemade AT redhat DOT com> - 20020502-20
+- Resolves:rh#1682169 - Added CI tests
+
 * Wed Jul 11 2018 Parag Nemade <pnemade AT fedoraproject DOT org> - 20020502-19
 - Update Source tag
 
diff --git a/tests/roles/custom-test-fonts/defaults/main.yml b/tests/roles/custom-test-fonts/defaults/main.yml
new file mode 100644
index 0000000..fe09145
--- /dev/null
+++ b/tests/roles/custom-test-fonts/defaults/main.yml
@@ -0,0 +1,7 @@
+---
+
+role_pkgs_req:
+  - fontconfig
+  - fontconfig-devel
+  - pkg-config
+  - rsync
diff --git a/tests/roles/custom-test-fonts/files/run-family-test b/tests/roles/custom-test-fonts/files/run-family-test
new file mode 100755
index 0000000..e87cad0
--- /dev/null
+++ b/tests/roles/custom-test-fonts/files/run-family-test
@@ -0,0 +1,153 @@
+#! /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}" | 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 "<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_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
diff --git a/tests/roles/custom-test-fonts/files/run-lang-coverage-test b/tests/roles/custom-test-fonts/files/run-lang-coverage-test
new file mode 100755
index 0000000..3d5f32b
--- /dev/null
+++ b/tests/roles/custom-test-fonts/files/run-lang-coverage-test
@@ -0,0 +1,224 @@
+#! /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
+-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_ARTIFACTS_DIR="${OPT_ARTIFACTS_DIR:-}"
+OPT_EXCLUDE=()
+OPT_INCLUDE=()
+OPT_NAME="${OPT_NAME:-}"
+
+opt=$(getopt -n "$0" --options "hvl:p:n:a:e:i:" --longoptions "help,verbose,lang:,path:,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
+	    ;;
+	-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_PATH" ]; 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."
+    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"
+    echo "- {result: $result, test: $OPT_LANG}" >> "$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_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)
+
+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"
+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[@]}"
+	    ret=$?
+	    set -e
+	    if [ $ret -eq 1 ]; then
+		debug "ignoring $i"
+		continue
+	    fi
+	    if [ ${#OPT_INCLUDE[@]} -ne 0 ]; then
+		set +e
+		contains "$n" "${OPT_INCLUDE[@]}"
+		ret=$?
+		set -e
+		if [ $ret -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."
+	    else
+		echo "RESULT: PASS: $i satisfy $OPT_LANG language coverage."
+	    fi
+	fi
+    done
+done
diff --git a/tests/roles/custom-test-fonts/meta/main.yml b/tests/roles/custom-test-fonts/meta/main.yml
new file mode 100644
index 0000000..f6d273c
--- /dev/null
+++ b/tests/roles/custom-test-fonts/meta/main.yml
@@ -0,0 +1,4 @@
+---
+
+dependencies:
+  - role: str-common-init
diff --git a/tests/roles/custom-test-fonts/tasks/main.yml b/tests/roles/custom-test-fonts/tasks/main.yml
new file mode 100644
index 0000000..51e821d
--- /dev/null
+++ b/tests/roles/custom-test-fonts/tasks/main.yml
@@ -0,0 +1,40 @@
+---
+
+- block:
+  - name: language coverage
+    script: run-lang-coverage-test --lang "{{ item }}" {% if coverage.values is not defined or coverage[item].path_prefix is not defined %} --path {{ path_prefix }} {% 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 }} {{ "" if coverage.values is not defined or coverage[item].exclude is not defined else '--exclude "' + (coverage[item].exclude | join('" --exclude "')) + '"'}} {{ "" if coverage.values is not defined or coverage[item].include is not defined else '--include "' + (coverage[item].include | join('" --include "')) + '"'}}
+    with_items:
+    - "{{ coverage if coverage.keys is not defined else coverage.keys()|list }}"
+  - name: generic family assignment
+    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
diff --git a/tests/tests.yml b/tests/tests.yml
new file mode 100644
index 0000000..94fe9b7
--- /dev/null
+++ b/tests/tests.yml
@@ -0,0 +1,15 @@
+- hosts: localhost
+  tags:
+  - classic
+  roles:
+  - role: custom-test-fonts
+    required_packages:
+    - kurdit-unikurd-web-fonts
+    path_prefix: /usr/share/fonts/kurdit-unikurd-web
+    package: kurdit-unikurd-web-fonts
+    coverage:
+    - ku-tr
+    families:
+    - lang: ku-tr
+      alias: sans-serif
+      family: Unikurd Web