#1 Added CI tests
Merged 4 years ago by pnemade. Opened 4 years ago by pnemade.
Unknown source master  into  master

@@ -0,0 +1,7 @@

+ ---

+ 

+ role_pkgs_req:

+   - fontconfig

+   - fontconfig-devel

+   - pkg-config

+   - rsync

@@ -0,0 +1,152 @@

+ #! /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_ALIAS" | sed -e 's/\//-/g' -e 's/ /-/g')

+ 

+ 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

@@ -0,0 +1,155 @@

+ #! /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

+ -a, --artifactsdir=DIR	test environment dir to store artifacts

+ -i, --ignore=FILE	Ignore FILE to check.

+ _EOF_

+ }

+ 

+ PROG="${PROG:-${0##*/}}"

+ DEBUG="${DEBUG:-}"

+ OPT_LANG="${OPT_LANG:-en}"

+ OPT_PATH="${OPT_PATH:-}"

+ OPT_ARTIFACTS_DIR="${OPT_ARTIFACTS_DIR:-}"

+ OPT_IGNORE=()

+ 

+ opt=$(getopt -n "$0" --options "hvl:p:t:a:i:" --longoptions "help,verbose,lang:,path:,test:,artifactsdir:,ignore:" -- "$@")

+ eval set -- "$opt"

+ while [[ $# -gt 0 ]]; do

+ 	case "$1" in

+ 	-i|--ignore)

+ 		OPT_IGNORE+=("$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

+ 

+ debug "Path: $OPT_PATH"

+ debug "Lang: $OPT_LANG"

+ debug "Artifacts dir: $OPT_ARTIFACTS_DIR"

+ debug "Ignore: ${OPT_IGNORE[@]}"

+ STR_TEST_DASHED=$(echo "$OPT_PATH" | sed -e 's/\//-/g')

+ 

+ clean_exit() {

+ 	rc=$?;

+ 	trap - SIGINT SIGTERM SIGABRT EXIT

+ 	echo "Run test $OPT_PATH: 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_PATH" >> "$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_PATH}" >> "$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)

+ 

+ contains() {

+ 	local e match="$1"

+ 	shift

+ 	for e; do [[ "$e" == "$match" ]] && return 1; done

+ 	return 0

+ }

+ 

+ debug "Check language coverage"

+ set +f

+ for i in `find $OPT_PATH -regex '.*/*\.\(t1\)?\(ttf\)?\(otf\)?\(ttc\)?'`; do

+     set -f

+     echo $i

+ 	if test -f $i; then

+ 		n=`basename $i`

+ 		set +e

+ 		contains "$n" "${OPT_IGNORE[@]}"

+ 		ret=$?

+ 		set -e

+ 		if [ $ret -eq 1 ]; then

+ 			debug "ignoring $i"

+ 			continue

+ 		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

+ 

@@ -0,0 +1,4 @@

+ ---

+ 

+ dependencies:

+   - role: str-common-init

@@ -0,0 +1,39 @@

+ ---

+ 

+ - block:

+   - name: language coverage

+     script: run-lang-coverage-test --lang "{{ item }}" --path "{{ path_prefix }}" --artifactsdir "{{ remote_artifacts }}" {{ "" if coverage.values is not defined or coverage[item].ignore is not defined else "--ignore " + (coverage[item].ignore | join('--ignore ')) }}

+     with_items:

+     - "{{ coverage if coverage.keys is not defined else coverage.keys()|list }}"

+   - name: generic family assignment

+     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

file added
+15
@@ -0,0 +1,15 @@

+ - hosts: localhost

+   tags:

+   - classic

+   roles:

+   - role: custom-test-fonts

+     required_packages:

+     - sil-abyssinica-fonts

+     path_prefix: /usr/share/fonts/sil-abyssinica

+     package: sil-abyssinica-fonts

+     coverage:

+      - en

+     families:

+     - lang: en

+       alias: serif

+       family: Abyssinica SIL