Compare commits

..

No commits in common. "c8-beta" and "c8s" have entirely different histories.
c8-beta ... c8s

19 changed files with 902 additions and 13 deletions

17
.gitignore vendored
View File

@ -1 +1,16 @@
SOURCES/noto-cjk-be6c059.tar.gz
/v1.004.tar.gz
/noto-cjk-32a5844.tar.gz
/be6c059ac1587e556e2412b27f5155c8eb3ddbe6.tar.gz
/noto-cjk-be6c059.tar.gz
/noto-cjk-782eab5.tar.gz
/03_NotoSansCJK-OTC.zip
/04_NotoSansCJK-OTF.zip
/04_NotoSerifCJKOTC.zip
/05_NotoSansCJK-SubsetOTF.zip
/05_NotoSerifCJKOTF.zip
/06_NotoSerifCJKSubsetOTF.zip
/11_NotoSansMonoCJKjp.zip
/12_NotoSansMonoCJKkr.zip
/13_NotoSansMonoCJKsc.zip
/14_NotoSansMonoCJKtc.zip
/15_NotoSansMonoCJKhk.zip

View File

@ -1 +0,0 @@
c3bd01902fc238e858d537dd45ae379b5dac62cd SOURCES/noto-cjk-be6c059.tar.gz

View File

@ -0,0 +1,92 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="scan">
<test name="family">
<string>Noto Sans CJK SC</string>
</test>
<edit name="lang" mode="assign">
<minus>
<name>lang</name>
<langset>
<string>ja</string>
<string>ko</string>
<string>zh-hk</string>
<string>zh-mo</string>
<string>zh-tw</string>
</langset>
</minus>
</edit>
</match>
<match target="scan">
<test name="family">
<string>Noto Sans CJK TC</string>
</test>
<edit name="lang" mode="assign">
<minus>
<name>lang</name>
<langset>
<string>ja</string>
<string>ko</string>
<string>zh-cn</string>
<string>zh-hk</string>
<string>zh-mo</string>
<string>zh-sg</string>
</langset>
</minus>
</edit>
</match>
<match target="scan">
<test name="family">
<string>Noto Sans CJK HK</string>
</test>
<edit name="lang" mode="assign">
<minus>
<name>lang</name>
<langset>
<string>ja</string>
<string>ko</string>
<string>zh-cn</string>
<string>zh-sg</string>
<string>zh-tw</string>
</langset>
</minus>
</edit>
</match>
<match target="scan">
<test name="family">
<string>Noto Sans CJK JP</string>
</test>
<edit name="lang" mode="assign">
<minus>
<name>lang</name>
<langset>
<string>ko</string>
<string>zh-cn</string>
<string>zh-hk</string>
<string>zh-mo</string>
<string>zh-sg</string>
<string>zh-tw</string>
</langset>
</minus>
</edit>
</match>
<match target="scan">
<test name="family">
<string>Noto Sans CJK KR</string>
</test>
<edit name="lang" mode="assign">
<minus>
<name>lang</name>
<langset>
<string>ja</string>
<string>zh-cn</string>
<string>zh-hk</string>
<string>zh-mo</string>
<string>zh-sg</string>
<string>zh-tw</string>
</langset>
</minus>
</edit>
</match>
</fontconfig>

13
README.md Normal file
View File

@ -0,0 +1,13 @@
# Noto CJK fonts
Download individual fonts from the download guides for [Noto Sans CJK](https://github.com/googlefonts/noto-cjk/tree/main/Sans#downloading-noto-sans-cjk) or [Noto Serif CJK](https://github.com/googlefonts/noto-cjk/tree/main/Serif#downloading-noto-serif-cjk) or look in [Releases](https://github.com/googlefonts/noto-cjk/releases)
Release notes and version history are documented separately for [Sans](https://github.com/googlefonts/noto-cjk/blob/main/Sans/NEWS.md#noto-sans-cjk-release-notes) and [Serif](https://github.com/googlefonts/noto-cjk/blob/main/Serif/NEWS.md#noto-serif-cjk-release-notes)
Noto CJK fonts are also available on [Google Fonts](https://fonts.google.com/noto/fonts) but under different names than in this repository. The two letter code here is replaced at Google Fonts as follows:
- *JP* -> *Japanese*
- *KR* -> *Korean*
- *SC* -> *Simplified Chinese*
- *TC* -> *Traditional Chinese*
- *HK* -> *Hong Kong*

7
gating.yaml Normal file
View File

@ -0,0 +1,7 @@
--- !Policy
product_versions:
- rhel-8
decision_context: osci_compose_gate
rules:
# this is the testcase identifier, which OSCI pipeline uses
- !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}

View File

@ -1,8 +1,9 @@
%global commit0 be6c059ac1587e556e2412b27f5155c8eb3ddbe6
%global shortcommit0 %(c=%{commit0}; echo ${c:0:7})
%global sans_version 2.004
%global serif_version 2.002
%global fontname google-noto-cjk
%global fontconf google-noto
%global fontconf2 65-%{fontconf}-cjk-fonts.conf
%global common_desc \
Noto CJK fonts, supporting Simplified Chinese, Traditional Chinese, \
@ -12,19 +13,34 @@ supported for compatibility with CJK standards. \
%{nil}
Name: google-noto-cjk-fonts
Version: 20190416
Version: 20230817
Release: 1%{?dist}
Summary: Google Noto Sans CJK Fonts
License: OFL
URL: https://github.com/googlei18n/noto-cjk
Source0: https://github.com/googlei18n/noto-cjk/archive/%{commit0}.tar.gz#/noto-cjk-%{shortcommit0}.tar.gz
Source1: genfontconf.py
Source2: genfontconf.sh
URL: https://github.com/notofonts/noto-cjk
Source0: https://github.com/notofonts/noto-cjk/releases/download/Sans%{sans_version}/03_NotoSansCJK-OTC.zip
Source1: https://github.com/notofonts/noto-cjk/releases/download/Sans%{sans_version}/04_NotoSansCJK-OTF.zip
Source2: https://github.com/notofonts/noto-cjk/releases/download/Sans%{sans_version}/05_NotoSansCJK-SubsetOTF.zip
Source3: https://github.com/notofonts/noto-cjk/releases/download/Sans%{sans_version}/11_NotoSansMonoCJKjp.zip
Source4: https://github.com/notofonts/noto-cjk/releases/download/Sans%{sans_version}/12_NotoSansMonoCJKkr.zip
Source5: https://github.com/notofonts/noto-cjk/releases/download/Sans%{sans_version}/13_NotoSansMonoCJKsc.zip
Source6: https://github.com/notofonts/noto-cjk/releases/download/Sans%{sans_version}/14_NotoSansMonoCJKtc.zip
Source7: https://github.com/notofonts/noto-cjk/releases/download/Sans%{sans_version}/15_NotoSansMonoCJKhk.zip
Source10: https://github.com/notofonts/noto-cjk/releases/download/Serif%{serif_version}/04_NotoSerifCJKOTC.zip
Source11: https://github.com/notofonts/noto-cjk/releases/download/Serif%{serif_version}/05_NotoSerifCJKOTF.zip
Source12: https://github.com/notofonts/noto-cjk/releases/download/Serif%{serif_version}/06_NotoSerifCJKSubsetOTF.zip
Source21: genfontconf.py
Source22: genfontconf.sh
Source23: %{fontconf2}
Source30: README.md
BuildArch: noarch
BuildRequires: fontpackages-devel
BuildRequires: python3-devel
BuildRequires: python3
BuildRequires: /usr/bin/xmllint
Requires: fontpackages-filesystem
Requires: google-noto-sans-cjk-ttc-fonts
@ -154,11 +170,17 @@ The google-noto-%subpkgname-fonts package contains %* fonts. \
%prep
%setup -q -n noto-cjk-%{commit0}
cp -p %{SOURCE1} %{SOURCE2} .
%setup -q -c
for zipfile in `ls %{SOURCE1} %{SOURCE2} %{SOURCE3} %{SOURCE4} %{SOURCE5} %{SOURCE6} %{SOURCE7} %{SOURCE10} %{SOURCE11} %{SOURCE12}`;
do unzip -j $zipfile -x LICENSE;
done
cp -p %{SOURCE21} %{SOURCE22} .
# generate the font conf files
bash -x ./genfontconf.sh
cp -p %{SOURCE30} .
%build
@ -206,15 +228,28 @@ do
%{buildroot}%{_fontconfig_confdir}/${fconf}
done
install -m 0644 -p %{SOURCE23} \
%{buildroot}%{_fontconfig_templatedir}/%{fontconf2}
ln -s %{_fontconfig_templatedir}/%{fontconf2} \
%{buildroot}%{_fontconfig_confdir}/%{fontconf2}
%files
%files common
%doc NEWS HISTORY README.formats README.third_party
%doc README.md
%license LICENSE
%{_fontconfig_templatedir}/%{fontconf2}
%config(noreplace) %{_fontconfig_confdir}/%{fontconf2}
%changelog
* Thu Nov 2 2023 Peng Wu <pwu@redhat.com> - 20230817-1
- Update Noto CJK to Sans 2.004 and Serif 2.002
- Resolves: RHEL-29145
* Wed May 8 2019 Peng Wu <pwu@redhat.com> - 20190416-1
- Update to git commit be6c059
- Resolves: #1702408

11
sources Normal file
View File

@ -0,0 +1,11 @@
SHA512 (03_NotoSansCJK-OTC.zip) = 3ab2f5f8a6437885ef5f1948aaa0fbbd4cbba2205c20869baaa680bb54641d32e38e7dce7eae07c3ebc1e3fcf7095fa5c23db557a473b4cf63efc7ac18a64b4a
SHA512 (04_NotoSansCJK-OTF.zip) = 17bc6d076d0d731ce8bcdf050be677bc6b4837d0b70275ea640fe070af6e948e3debae93ac5cd85c7607ff1da4449a4c29dc1aec9d4c725dec81a745490a54bb
SHA512 (04_NotoSerifCJKOTC.zip) = 8eba2d4805e974e7d7137f95c5d2ea08374f7faa34275d89315a4bebb93fde34bf157f7cf2be077f7349f908f129d5ec297a9798f8a99de244dca73b60ce0682
SHA512 (05_NotoSansCJK-SubsetOTF.zip) = 39b7cd07c96ac1d3f716bdde1e88819b31956aa3fc49fc808eb0fa92b3ed9d49fa253d333993c2c866b99f8b08fd73bf0e04d143cbd957ac922736ba087c47de
SHA512 (05_NotoSerifCJKOTF.zip) = 368d3a7b27cbf7f2f29e19ff42ebb60b4e6b39b51880224bd76b8c79b10a5fd7cfb69a5d3b5c629f87390bd137c9ac4f3b25d90166517f9d96b29a4847dfc0c5
SHA512 (06_NotoSerifCJKSubsetOTF.zip) = 7041307211d3ac523fb65d97f7ba3b8285c4e778ef207fa9777f8991a18310d72db549a2b7a8c411728368e040919e1727b47be9d098d707bb84686f6d4aa21b
SHA512 (11_NotoSansMonoCJKjp.zip) = b4cb166ec28a06237dc4aaf0e6fc2a47380c3c0b32c005d69d36c4fac6eb6bddac8f80e9729ef202ee5787682bab534e4db88aea27cc4d951d7add368a2248d3
SHA512 (12_NotoSansMonoCJKkr.zip) = 7462cfbab25ab741735e874b10d9e4b04d92f3a4f4b98daaf4dccbe8341d51db7524bb2757a813045109bdff53dee520247f0ffa501b7148f032712a2e20dae0
SHA512 (13_NotoSansMonoCJKsc.zip) = 3c501aab12522b608ffbe002eff2451bf30501637138e257ce4e924c644372c0d7348ae5b340ff085889c741df0adca53d3e5c999793498bedbfe578deda833a
SHA512 (14_NotoSansMonoCJKtc.zip) = e418d5e551d3390295843e410cb76b402ce0126e08869e36015c35fb3997e280d4f63122cd843d7f14df8f3680df020d645269f97463cb1a0c33b360ab3edd9d
SHA512 (15_NotoSansMonoCJKhk.zip) = 98bf37b26b1654bcd653431ea34b7c8e77820d3c237803087b54a84dbb0bd8f494179752ff991ad36198de3077202e6c1ed92a484929cfa987730696763c0691

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,2 @@
role_pkgs_req:
- rsync

View File

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

View File

@ -0,0 +1,87 @@
---
- name: Check if fontconfig is installed
register: fontconfig_testing_runner
find:
paths: "{{ ansible_env.PATH.split(':') }}"
pattern: fc-validate
- name: Install fontconfig
when: fontconfig_testing_runner.matched == 0
block:
- name: Installing fontconfig
package:
name:
- fontconfig
- name: Start fontconfig tests
block:
- name: Execute tests
shell: |
set -e
log_file="{{ remote_artifacts }}/{{ installed_test_name }}.log"
exec 2>>$log_file 1>>$log_file
echo "Starting fontconfig tests"
TEST=google-noto-sans-cjk-ttc-fonts
status="FAIL"
fc-validate -l jp /usr/share/fonts/google-noto-cjk/NotoSansCJK-*.ttc
if [ $? -eq 0 ]; then
status="PASS"
fi
echo "${status} $TEST JP" >> {{ remote_artifacts }}/test.log
status="FAIL"
fc-validate -l kr /usr/share/fonts/google-noto-cjk/NotoSansCJK-*.ttc
if [ $? -eq 0 ]; then
status="PASS"
fi
echo "${status} $TEST KR" >> {{ remote_artifacts }}/test.log
status="FAIL"
fc-validate -l zh_cn /usr/share/fonts/google-noto-cjk/NotoSansCJK-*.ttc
if [ $? -eq 0 ]; then
status="PASS"
fi
echo "${status} $TEST SC" >> {{ remote_artifacts }}/test.log
status="FAIL"
fc-validate -l zh_tw /usr/share/fonts/google-noto-cjk/NotoSansCJK-*.ttc
if [ $? -eq 0 ]; then
status="PASS"
fi
echo "${status} $TEST TC" >> {{ remote_artifacts }}/test.log
TEST=google-noto-serif-cjk-ttc-fonts
status="FAIL"
fc-validate -l jp /usr/share/fonts/google-noto-cjk/NotoSerifCJK-*.ttc
if [ $? -eq 0 ]; then
status="PASS"
fi
echo "${status} $TEST JP" >> {{ remote_artifacts }}/test.log
status="FAIL"
fc-validate -l kr /usr/share/fonts/google-noto-cjk/NotoSerifCJK-*.ttc
if [ $? -eq 0 ]; then
status="PASS"
fi
echo "${status} $TEST KR" >> {{ remote_artifacts }}/test.log
status="FAIL"
fc-validate -l zh_cn /usr/share/fonts/google-noto-cjk/NotoSerifCJK-*.ttc
if [ $? -eq 0 ]; then
status="PASS"
fi
echo "${status} $TEST SC" >> {{ remote_artifacts }}/test.log
status="FAIL"
fc-validate -l zh_tw /usr/share/fonts/google-noto-cjk/NotoSerifCJK-*.ttc
if [ $? -eq 0 ]; then
status="PASS"
fi
echo "${status} $TEST TC" >> {{ remote_artifacts }}/test.log
- name: Check the results
shell: grep "^FAIL" {{ remote_artifacts }}/test.log
register: test_fails
failed_when: False
- name: Set role result
set_fact:
role_result_failed: "{{ (test_fails.stdout|d|length > 0) or (test_fails.stderr|d|length > 0) }}"
role_result_msg: "{{ test_fails.stdout|d('tests failed.') }}"
- include_role:
name: str-common-final

82
tests/tests.yml Normal file
View File

@ -0,0 +1,82 @@
- hosts: localhost
tags:
- classic
roles:
- role: custom-test-fonts
required_packages:
- google-noto-sans-cjk-ttc-fonts
- google-noto-serif-cjk-ttc-fonts
coverage:
ja:
path_prefix:
- /usr/share/fonts/google-noto-cjk
include:
- NotoSansCJK-.*ttc
- NotoSerifCJK-.*ttc
ko:
path_prefix:
- /usr/share/fonts/google-noto-cjk
include:
- NotoSansCJK-.*ttc
- NotoSerifCJK-.*ttc
zh-cn:
path_prefix:
- /usr/share/fonts/google-noto-cjk
include:
- NotoSansCJK-.*ttc
- NotoSerifCJK-.*ttc
zh-tw:
path_prefix:
- /usr/share/fonts/google-noto-cjk
include:
- NotoSansCJK-.*ttc
- NotoSerifCJK-.*ttc
families:
- lang: ja
package: google-noto-sans-cjk-ttc-fonts
alias: sans-serif
family: Noto Sans CJK JP
- lang: ko
package: google-noto-sans-cjk-ttc-fonts
alias: sans-serif
family: Noto Sans CJK KR
- lang: zh-cn
package: google-noto-sans-cjk-ttc-fonts
alias: sans-serif
family: Noto Sans CJK SC
- lang: zh-tw
package: google-noto-sans-cjk-ttc-fonts
alias: sans-serif
family: Noto Sans CJK TC
- lang: ja
package: google-noto-serif-cjk-ttc-fonts
alias: serif
family: Noto Serif CJK JP
- lang: ko
package: google-noto-serif-cjk-ttc-fonts
alias: serif
family: Noto Serif CJK KR
- lang: zh-cn
package: google-noto-serif-cjk-ttc-fonts
alias: serif
family: Noto Serif CJK SC
- lang: zh-tw
package: google-noto-serif-cjk-ttc-fonts
alias: serif
family: Noto Serif CJK TC
- lang: ja
package: google-noto-sans-cjk-ttc-fonts
alias: monospace
family: Noto Sans Mono CJK JP
- lang: ko
package: google-noto-sans-cjk-ttc-fonts
alias: monospace
family: Noto Sans Mono CJK KR
- lang: zh-cn
package: google-noto-sans-cjk-ttc-fonts
alias: monospace
family: Noto Sans Mono CJK SC
- lang: zh-tw
package: google-noto-sans-cjk-ttc-fonts
alias: monospace
family: Noto Sans Mono CJK TC